Search code examples
javauser-interfacedatatablegwtdomino-ui

Conditional datatable row color using domino-ui


Can we change the background color of a domino-ui datatable row based on some expression or a condition? for example make the row background red if DueDate < Today.


Solution

  • Domino-ui datatable has a built-in plugin called Marker plugin that can mark the row conditionally with different colors, the plugin adds the color as a border to the left border of the row

    enter image description here

    you can find an example in domino-ui demo here

    and if that is not enough you can create your own plugin, like this

    import elemental2.dom.HTMLTableRowElement;
    import org.dominokit.domino.ui.datatable.DataTable;
    import org.dominokit.domino.ui.datatable.TableRow;
    import org.dominokit.domino.ui.datatable.plugins.DataTablePlugin;
    
    public class RowColorPlugin<T> implements DataTablePlugin<T> {
    
        @Override
        public void onRowAdded(DataTable<T> dataTable, TableRow<T> tableRow) {
            T record = tableRow.getRecord();
            HTMLTableRowElement row = tableRow.element();
            // Add css classes or set css properties in the row element based on the row record to change the row colors
        }
    }
    

    And here is a sample showing how to use the custom plugin

    TableConfig<Contact> tableConfig = new TableConfig<>();
            tableConfig
                    .addColumn(ColumnConfig.<Contact>create("id", "#")
                            .textAlign("right")
                            .asHeader()
                            .setCellRenderer(cell -> TextNode.of(cell.getTableRow().getRecord().getIndex() + 1 + "")))
    
                    .addColumn(ColumnConfig.<Contact>create("status", "Status")
                            .textAlign("center")
                            .setCellRenderer(cell -> {
                                if (cell.getTableRow().getRecord().isActive()) {
                                    return Style.of(Icons.ALL.check_circle()).setColor(Color.GREEN_DARKEN_3.getHex()).element();
                                } else {
                                    return Style.of(Icons.ALL.highlight_off()).setColor(Color.RED_DARKEN_3.getHex()).element();
                                }
                            }))
                    .addColumn(ColumnConfig.<Contact>create("firstName", "First name")
                            .setCellRenderer(cell -> TextNode.of(cell.getTableRow().getRecord().getName())))
    
    
                    .addColumn(ColumnConfig.<Contact>create("gender", "Gender")
                            .setCellRenderer(cell -> ContactUiUtils.getGenderElement(cell.getRecord()))
                            .textAlign("center"))
    
                    .addColumn(ColumnConfig.<Contact>create("eyeColor", "Eye color")
                            .setCellRenderer(cell -> ContactUiUtils.getEyeColorElement(cell.getRecord()))
                            .textAlign("center"))
    
                    .addColumn(ColumnConfig.<Contact>create("balance", "Balance")
                            .setCellRenderer(cellInfo -> ContactUiUtils.getBalanceElement(cellInfo.getRecord())))
    
                    .addColumn(ColumnConfig.<Contact>create("email", "Email")
                            .setCellRenderer(cell -> TextNode.of(cell.getTableRow().getRecord().getEmail())))
    
                    .addColumn(ColumnConfig.<Contact>create("phone", "Phone")
                            .setCellRenderer(cell -> TextNode.of(cell.getTableRow().getRecord().getPhone())))
    
                    .addColumn(ColumnConfig.<Contact>create("badges", "Badges")
                            .setCellRenderer(cell -> {
                                if (cell.getTableRow().getRecord().getAge() < 35) {
                                    return Badge.create("Young")
                                            .setBackground(ColorScheme.GREEN.color()).element();
                                }
                                return TextNode.of("");
                            }));
    
            tableConfig.addPlugin(new RowColorPlugin<>(tableCellInfo -> ContactUiUtils.getBalanceColor(tableCellInfo.getRecord())));
            LocalListDataStore<Contact> localListDataStore = new LocalListDataStore<>();
            DataTable<Contact> defaultTable = new DataTable<>(tableConfig, localListDataStore);
        localListDataStore.setData(contactsList);