Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
com.tcdng.unify.web.ui.widget.writer.control.TableWriter Maven / Gradle / Ivy
/*
* Copyright 2018-2023 The Code Department.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.tcdng.unify.web.ui.widget.writer.control;
import java.util.List;
import com.tcdng.unify.core.UnifyException;
import com.tcdng.unify.core.UserToken;
import com.tcdng.unify.core.annotation.Component;
import com.tcdng.unify.core.annotation.Writes;
import com.tcdng.unify.core.data.ValueStore;
import com.tcdng.unify.core.util.DataUtils;
import com.tcdng.unify.core.util.StringUtils;
import com.tcdng.unify.core.util.json.JsonWriter;
import com.tcdng.unify.web.ui.widget.Control;
import com.tcdng.unify.web.ui.widget.EventHandler;
import com.tcdng.unify.web.ui.widget.PushType;
import com.tcdng.unify.web.ui.widget.ResponseWriter;
import com.tcdng.unify.web.ui.widget.Widget;
import com.tcdng.unify.web.ui.widget.control.ColumnState;
import com.tcdng.unify.web.ui.widget.control.Table;
import com.tcdng.unify.web.ui.widget.control.Table.Column;
import com.tcdng.unify.web.ui.widget.control.Table.Row;
import com.tcdng.unify.web.ui.widget.control.Table.RowValueStore;
import com.tcdng.unify.web.ui.widget.writer.AbstractControlWriter;
import com.tcdng.unify.web.util.HtmlUtils;
/**
* Table writer.
*
* @author The Code Department
* @since 1.0
*/
@Writes(Table.class)
@Component("table-writer")
public class TableWriter extends AbstractControlWriter {
private static final String SELECT_CLASSNAME_BASE = "tsel";
@Override
protected void doWriteStructureAndContent(ResponseWriter writer, Widget widget) throws UnifyException {
Table table = (Table) widget;
table.pageCalculations();
writer.write("");
if (table.isWindowed()) {
// String id = table.getId();
writer.write("
");
// Header
writer.write("
");
writer.write(
"
");
writer.write("
");
writer.write("
");
writeHeaderRow(writer, table);
writer.write("
");
writer.write("
");
writer.write("
");
// Body
writer.write("
");
writer.write("
");
writer.write("
");
writer.write("
");
writeBodyRows(writer, table);
writer.write("
");
writer.write("
");
if (table.isPagination()) {
// Pagination
writer.write("
");
writePaginationRow(writer, table);
writer.write("
");
}
writer.write("
");
} else {
writer.write("
");
writer.write("
");
writeHeaderRow(writer, table);
writeBodyRows(writer, table);
writer.write("
");
if (table.isPagination()) {
writePaginationRow(writer, table);
}
writer.write("
");
}
if (table.isMultiSelect()) {
writeHiddenPush(writer, table.getSelectGroupId(), PushType.GROUP);
}
if (table.isContainerEditable()) {
writeHiddenPush(writer, table.getDataGroupId(), PushType.GROUP);
}
writer.writeStructureAndContent(table.getViewIndexCtrl());
if (table.isSortable()) {
table.setColumnIndex(-1);
writer.writeStructureAndContent(table.getColumnIndexCtrl());
writer.writeStructureAndContent(table.getSortDirectionCtrl());
}
writer.write("
");
}
@Override
protected void doWriteBehavior(ResponseWriter writer, Widget widget) throws UnifyException {
super.doWriteBehavior(writer, widget);
Table table = (Table) widget;
// Internal control behavior
Control itemsPerPageCtrl = table.getItemsPerPageCtrl();
if (itemsPerPageCtrl != null) {
writer.writeBehavior(itemsPerPageCtrl);
}
Control multiSelectCtrl = table.getMultiSelectCtrl();
if (multiSelectCtrl != null) {
multiSelectCtrl.setValueStore(null);
multiSelectCtrl.setGroupId(null);
writer.writeBehavior(multiSelectCtrl, table.getSelectAllId());
}
// External control behavior
List writeRowList = table.getValueList();
int index = table.getPageItemIndex();
int lastIndex = index + table.getPageItemCount();
for (; index < lastIndex; index++) {
ValueStore itemValueStore = writeRowList.get(index).getRowValueStore();
if (multiSelectCtrl != null) {
multiSelectCtrl.setValueStore(itemValueStore);
writer.writeBehavior(multiSelectCtrl);
}
for (Column column : table.getColumnList()) {
if (column.isVisible()) {
Control control = column.getControl();
control.setValueStore(itemValueStore);
writer.writeBehavior(control);
}
}
}
// Row behavior if any
EventHandler[] rowEventHandlers = table.getUplAttribute(EventHandler[].class, "rowEventHandler");
if (rowEventHandlers != null) {
for (EventHandler rowEventHandler : rowEventHandlers) {
writer.writeBehavior(rowEventHandler, table.getRowId(), null);
}
}
// Get summary
if (table.isMultiSelect()) {
}
// Append table rigging
writer.beginFunction("ux.rigTable");
writer.writeParam("pId", table.getId());
writer.writeParam("pContId", table.getContainerId());
writer.writeCommandURLParam("pCmdURL");
writer.writeParam("pIdxCtrlId", table.getViewIndexCtrl().getId());
writer.writeParam("pBaseIdx", table.getPageItemIndex());
writer.writeParam("pSelectable", table.isRowSelectable());
if (table.isRowSelectable()) {
writer.writeParam("pSelClassNm", getSelectClassName());
writer.writeParam("pSelDepList", DataUtils.toArray(String.class, table.getSelDependentList()));
}
writer.writeParam("pWindowed", table.isWindowed());
writer.writeParam("pPagination", table.isPagination());
writer.writeParam("pItemCount", table.getPageItemCount());
if (table.isPagination()) {
writer.writeParam("pCurrPgCtrlId", table.getCurrentPageCtrl().getId());
writer.writeParam("pItemPerPgCtrlId", table.getItemsPerPageCtrl().getId());
writer.writeParam("pCurrPage", table.getCurrentPage());
writer.writeParam("pPageCount", table.getTotalPages());
writer.writeParam("pNaviStart", table.getNaviPageStart());
writer.writeParam("pNaviStop", table.getNaviPageStop());
}
if (table.getPageItemCount() <= 0) {
writer.writeParam("pConDepList", DataUtils.toArray(String.class, table.getContentDependentList()));
}
writer.writeParam("pMultiSel", table.isMultiSelect());
if (table.isMultiSelect()) {
// Normal multi-select details
if (!table.isRowSelectable()) {
writer.writeParam("pSelClassNm", getSelectClassName());
}
writer.writeParam("pSelAllId", table.getSelectAllId());
writer.writeParam("pSelGrpId", table.getSelectGroupId());
writer.writeParam("pVisibleSel", table.getPageSelectedRowCount());
writer.writeParam("pHiddenSel", table.getSelectedRows() - table.getPageSelectedRowCount());
writer.writeParam("pMultiSelDepList", DataUtils.toArray(String.class, table.getMultiSelDependentList()));
// Summary columns
int summaryColIndex = 1; // Because of multi-select column
if (table.isSerialNumbers()) {
summaryColIndex++;
}
String summarySrc = table.getSummarySrc();
if (StringUtils.isNotBlank(summarySrc)) {
writer.writeParam("pSumSrc", summarySrc);
writer.writeParam("pSumProcList", table.getSummaryProcList());
writer.writeParam("pSumDepList", DataUtils.toArray(String.class, table.getSummaryDependentList()));
}
JsonWriter jw = new JsonWriter();
jw.beginArray();
for (Column column : table.getColumnList()) {
if (column.isVisible()) {
if (column.isColumnSelectSummary()) {
Control control = column.getControl();
jw.beginObject();
jw.write("idx", summaryColIndex);
jw.write("nm", control.getShortName());
jw.endObject();
}
summaryColIndex++;
}
}
jw.endArray();
writer.writeParam("pSumColList", jw);
}
boolean shiftable = table.getShiftDirectionId() != null;
writer.writeParam("pShiftable", shiftable);
if (shiftable) {
writer.writeParam("pShiftDirId", table.getShiftDirectionId());
writer.writeParam("pShiftTopId", table.getShiftTopId());
writer.writeParam("pShiftUpId", table.getShiftUpId());
writer.writeParam("pShiftDownId", table.getShiftDownId());
writer.writeParam("pShiftBottomId", table.getShiftBottomId());
writer.writeParam("pDeleteId", table.getDeleteId());
}
writer.writeParam("pSortable", table.isSortable());
if (table.isSortable()) {
writer.writeParam("pColIdxId", table.getColumnIndexCtrl().getId());
writer.writeParam("pSortDirId", table.getSortDirectionCtrl().getId());
writer.writeParam("pSortAscId", table.getAscImageCtrl().getId());
writer.writeParam("pSortDescId", table.getDescImageCtrl().getId());
JsonWriter jw = new JsonWriter();
jw.beginArray();
List columnStates = table.getColumnStates();
for (int i = 0; i < columnStates.size(); i++) {
ColumnState columnState = columnStates.get(i);
if (columnState.isSortable()) {
jw.beginObject();
jw.write("idx", i);
jw.write("ascend", columnState.isAscending());
jw.write("field", columnState.getFieldName());
jw.endObject();
}
}
jw.endArray();
writer.writeParam("pSortColList", jw);
}
writer.endFunction();
}
private void writeHeaderRow(ResponseWriter writer, Table table) throws UnifyException {
writer.write("");
table.clearVisibleColumnCount();
if (table.isSerialNumbers()) {
String snSym = table.getSerialNumberSymbol();
if (snSym != null) {
writer.write("").write(snSym).write(" ");
} else {
writer.write(" ");
}
table.incrementVisibleColumnCount();
}
boolean isMultiSelect = table.isMultiSelect();
boolean isShowMultiSelectCheckboxes = table.isShowMultiSelectCheckboxes();
boolean isHideMultiSelectBorder = isMultiSelect && !isShowMultiSelectCheckboxes;
if (isMultiSelect) {
if (isShowMultiSelectCheckboxes) {
writer.write("");
} else {
writer.write(" ");
}
Control multiSelectCtrl = table.getMultiSelectCtrl();
multiSelectCtrl.setValueStore(null);
multiSelectCtrl.setGroupId(null);
writer.writeStructureAndContent(multiSelectCtrl, table.getSelectAllId());
writer.write(" ");
table.incrementVisibleColumnCount();
}
boolean isHeaderEllipsis = table.isHeaderEllipsis();
for (Column column : table.getColumnList()) {
if (column.isVisible()) {
Control control = column.getControl();
writer.write("");
} else {
writer.write(">");
}
String caption = control.getCaption();
if (caption != null) {
writer.write(caption);
} else {
writer.writeHtmlFixedSpace();
}
if (column.isSortable()) {
writer.write(" ");
Control imageCtrl = null;
if (column.isAscending()) {
imageCtrl = table.getAscImageCtrl();
} else {
imageCtrl = table.getDescImageCtrl();
}
writer.writeStructureAndContent(imageCtrl, imageCtrl.getPrefixedId(column.getFieldName() + '_'));
writer.write(" ");
}
writer.write(" ");
table.incrementVisibleColumnCount();
}
}
writer.write(" ");
}
private void writeBodyRows(ResponseWriter writer, Table table) throws UnifyException {
if (table.getPageItemCount() > 0) {
List writeRowList = table.getValueList();
final boolean isWindowed = table.isWindowed();
int index = table.getPageItemIndex();
int lastIndex = index + table.getPageItemCount();
table.clearPageSelectedRowCount();
final boolean isSerialNo = table.isSerialNumbers();
final boolean isMultiSelect = table.isMultiSelect();
final boolean isContainerDisabled = table.isContainerDisabled();
final boolean isContainerEditable = table.isContainerEditable();
final boolean isShowMultiSelectCheckboxes = table.isShowMultiSelectCheckboxes();
final boolean isHideMultiSelectBorder = isMultiSelect && !isShowMultiSelectCheckboxes;
String dataGroupId = null;
if (isContainerEditable) {
dataGroupId = table.getDataGroupId();
}
Control multiSelectCtrl = null;
if (isMultiSelect) {
multiSelectCtrl = table.getMultiSelectCtrl();
multiSelectCtrl.setGroupId(table.getSelectGroupId());
}
// Set column mode
for (Column column : table.getColumnList()) {
if (column.isVisible()) {
Control control = column.getControl();
control.setDisabled(isContainerDisabled);
control.setEditable(isContainerEditable);
control.setGroupId(dataGroupId);
}
}
// Write rows
String columnStyle = null;
boolean firstRowWrite = true;
// Enter writer table mode. Column rendering will use table style if supported
// by column control.
writer.setTableMode(true);
for (; index < lastIndex; index++) {
writer.write("");
int columnIndex = 0;
if (isSerialNo) {
writer.write("");
writer.write(index + 1); // Localization?
writer.write(". ");
columnIndex++;
}
Row row = writeRowList.get(index);
RowValueStore rowValueStore = row.getRowValueStore();
if (isMultiSelect) {
if (row.isSelected()) {
table.incrementPageSelectedRowCount();
}
multiSelectCtrl.setValueStore(rowValueStore);
writer.write("");
writer.writeStructureAndContent(multiSelectCtrl);
writer.write(" ");
}
for (Column column : table.getColumnList()) {
if (column.isVisible()) {
Control control = column.getControl();
control.setValueStore(rowValueStore);
writer.write("");
writer.writeStructureAndContent(control);
writer.write(" ");
columnIndex++;
}
}
writer.write(" ");
firstRowWrite = false;
}
// Disable writer table mode
writer.setTableMode(false);
} else {
writer.write("');
writer.write(getSessionMessage("table.no.items.to.display"));
writer.write(" ");
}
}
private String getSelectClassName() throws UnifyException {
UserToken userToken = getUserToken();
if (userToken != null && StringUtils.isNotBlank(userToken.getColorScheme())) {
return SELECT_CLASSNAME_BASE + userToken.getColorScheme();
}
return SELECT_CLASSNAME_BASE;
}
private void writePaginationRow(ResponseWriter writer, Table table) throws UnifyException {
writer.write("");
writer.write("");
writer.write("");
if (table.getPageItemCount() > 0) {
writer.write(getSessionMessage("table.items.of.total.displayed", table.getPageItemIndex() + 1,
table.getPageItemIndex() + table.getPageItemCount(), table.getTotalItemCount()));
} else {
writer.write(getSessionMessage("table.no.item.displayed"));
}
writer.write(" ");
writer.write(" ");
writer.write("");
writer.write("
");
writer.write("").write(getSessionMessage("table.items.per.page")).write(" ");
writer.write("
");
writer.write("
");
writer.writeStructureAndContent(table.getCurrentPageCtrl());
writer.writeStructureAndContent(table.getItemsPerPageCtrl());
writer.write("
");
writer.write("
");
writer.write("");
writer.write("< ");
int naviPageStop = table.getNaviPageStop();
String id = table.getId();
for (int i = table.getNaviPageStart(); i <= naviPageStop;) {
writer.write(" 0) {
writer.write(">").write(++i).write(" ");
} else {
writer.write(">").write(i++).write("");
}
}
writer.writeHtmlFixedSpace();
writer.write("");
writer.write("> ");
writer.write("
");
writer.write("
");
writer.write("
");
}
}