improve view of meta data by using icons for boolean and add search

This commit is contained in:
Thomas Peetz
2025-01-08 10:39:52 +01:00
parent faa1d73eea
commit d51bc47ffe
7 changed files with 143 additions and 17 deletions
@@ -177,7 +177,7 @@ public class SetupModuleAdmin implements ApplicationListener<ContextRefreshedEve
metaDataService.getColumn(comicTable, "last_modified_date", "modified", "TIMESTAMP", null, 3, Boolean.FALSE, "", Boolean.FALSE, null);
metaDataService.getColumn(comicTable, "version", "version", "LONG", null, 4, Boolean.FALSE, "", Boolean.FALSE, null);
metaDataService.getColumn(comicTable, "completed", "completed", "BOOLEAN", null, 5, Boolean.TRUE, "Complete", Boolean.TRUE, "Complete");
metaDataService.getColumn(comicTable, "current_order", "current_order", "BOOLEAN", null, 6, Boolean.TRUE, "Betsellung", Boolean.TRUE, "Bestellung");
metaDataService.getColumn(comicTable, "current_order", "current_order", "BOOLEAN", null, 6, Boolean.TRUE, "Bestellung", Boolean.TRUE, "Bestellung");
metaDataService.getColumn(comicTable, "title", "title", "TEXT", "UNIQUE", 7, Boolean.TRUE, "Title", Boolean.FALSE, null);
metaDataService.getColumn(comicTable, "publisher_id", "publisher_id", "TEXT", null, 8, Boolean.TRUE, "Verlag", Boolean.FALSE, null);
MetaDataTable issueTable = metaDataService.getTable("issue");
@@ -40,4 +40,8 @@ public class MetaDataColumn extends AbstractEntity {
@JoinColumn(name = "table_id")
@NotNull
private MetaDataTable table;
public String getTableName() {
return table.getTableName();
}
}
@@ -1,10 +1,16 @@
package de.thpeetz.kontor.admin.data;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.util.List;
public interface MetaDataColumnRepository extends JpaRepository<MetaDataColumn, String> {
List<MetaDataColumn> findByTable(MetaDataTable table);
@Query("select m from MetaDataColumn m " +
"where lower(m.columnName) like lower(concat('%', :searchTerm, '%')) or lower(m.columnLabel) like lower(concat('%', :searchTerm, '%'))")
List<MetaDataColumn> search(@Param("searchTerm") String searchTerm);
}
@@ -36,7 +36,7 @@ public class MetaDataService {
public void getColumn(MetaDataTable table, String columnName, String columnSyncName, String columnType, String columnModifier, Integer columnOrder, Boolean isShown, String columnLabel, Boolean showFilter, String filterLabel) {
if (table.getTableColumns().stream().anyMatch(column -> column.getColumnName().equals(columnName))) {
log.info("Column {} with name {} of table {} found, check Values", columnOrder, columnName, table.getTableName());
log.debug("Column {} with name {} of table {} found, check Values", columnOrder, columnName, table.getTableName());
MetaDataColumn column = table.getTableColumns().get(columnOrder.intValue()-1);
if (!column.getColumnName().equals(columnName)) {
log.debug("columnName has to be changed to {}", columnName);
@@ -85,8 +85,15 @@ public class MetaDataService {
}
}
public List<MetaDataColumn> findAllMetaDataColumns() {
return metaDataColumnRepository.findAll();
public List<MetaDataColumn> findAllMetaDataColumns(String stringFilter) {
if (stringFilter == null || stringFilter.isEmpty()) {
log.debug("Found " + metaDataColumnRepository.count()+ " entries");
return metaDataColumnRepository.findAll();
} else {
List<MetaDataColumn> results = metaDataColumnRepository.search(stringFilter);
log.debug("Found " + results.size() + " entries");
return results;
}
}
public void deleteMetaDataColumn(MetaDataColumn metaDataColumn) {
@@ -26,7 +26,9 @@ public class MetaDataForm extends FormLayout {
TextField columnModifier = new TextField("Column Modifier");
IntegerField columnOrder = new IntegerField("Column Order");
Checkbox isShown = new Checkbox("Is Shown");
TextField columnLabel = new TextField("Column Label");
Checkbox showFilter = new Checkbox("Show Filter");
TextField filterLabel = new TextField("Filter Label");
Button save = new com.vaadin.flow.component.button.Button("Save");
Button delete = new com.vaadin.flow.component.button.Button("Delete");
@@ -40,12 +42,12 @@ public class MetaDataForm extends FormLayout {
table.setItems(tables);
table.setItemLabelGenerator(MetaDataTable::getTableName);
add(table, 2);
add(columnName, 2);
add(columnSyncName, 2);
add(columnModifier, 2);
add(columnOrder, 2);
add(isShown, showFilter, createButtonsLayout());
add(table, columnName, columnSyncName, columnModifier, columnOrder);
add(isShown, columnLabel);
isShown.addClickListener(click -> columnLabel.setEnabled(isShown.getValue()));
add(showFilter, filterLabel);
showFilter.addClickListener(click -> filterLabel.setEnabled(showFilter.getValue()));
add(createButtonsLayout());
}
private HorizontalLayout createButtonsLayout() {
@@ -2,9 +2,18 @@ package de.thpeetz.kontor.admin.views;
import com.vaadin.flow.component.Component;
import com.vaadin.flow.component.button.Button;
import com.vaadin.flow.component.button.ButtonVariant;
import com.vaadin.flow.component.contextmenu.ContextMenu;
import com.vaadin.flow.component.contextmenu.MenuItem;
import com.vaadin.flow.component.grid.Grid;
import com.vaadin.flow.component.grid.GridSortOrder;
import com.vaadin.flow.component.icon.Icon;
import com.vaadin.flow.component.icon.VaadinIcon;
import com.vaadin.flow.component.orderedlayout.HorizontalLayout;
import com.vaadin.flow.component.orderedlayout.VerticalLayout;
import com.vaadin.flow.component.textfield.TextField;
import com.vaadin.flow.data.provider.SortDirection;
import com.vaadin.flow.data.value.ValueChangeMode;
import com.vaadin.flow.router.PageTitle;
import com.vaadin.flow.router.Route;
import com.vaadin.flow.spring.annotation.SpringComponent;
@@ -13,9 +22,13 @@ import de.thpeetz.kontor.admin.data.MetaDataColumn;
import de.thpeetz.kontor.admin.services.MetaDataService;
import de.thpeetz.kontor.common.views.MainLayout;
import jakarta.annotation.security.RolesAllowed;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Scope;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@SpringComponent
@Scope("prototype")
@@ -24,10 +37,56 @@ import org.springframework.context.annotation.Scope;
@PageTitle("Meta Data | Admin | Kontor")
public class MetaDataView extends VerticalLayout {
Grid<MetaDataColumn> grid = new Grid<>(MetaDataColumn.class);
Grid<MetaDataColumn> grid = new Grid<>(MetaDataColumn.class, false);
Grid.Column<MetaDataColumn> idColumn = grid.addColumn(MetaDataColumn::getId)
.setHeader("ID").setResizable(true).setSortable(true);
Grid.Column<MetaDataColumn> createdColumn = grid.addColumn(MetaDataColumn::getCreatedDate)
.setHeader("Erstellt").setResizable(true).setSortable(true);
Grid.Column<MetaDataColumn> modifiedColumn = grid.addColumn(MetaDataColumn::getLastModifiedDate)
.setHeader("Geändert").setResizable(true).setSortable(true);
Grid.Column<MetaDataColumn> versionColumn = grid.addColumn(MetaDataColumn::getVersion)
.setHeader("Version").setResizable(true).setSortable(true);
Grid.Column<MetaDataColumn> tableColumn = grid.addColumn(MetaDataColumn::getTableName)
.setHeader("Table").setResizable(true).setSortable(true);
Grid.Column<MetaDataColumn> columnNameColumn = grid.addColumn(MetaDataColumn::getColumnName)
.setHeader("Column Name").setResizable(true).setSortable(true);
Grid.Column<MetaDataColumn> columnSyncNameColumn = grid.addColumn(MetaDataColumn::getColumnSyncName)
.setHeader("Column Sync Name").setResizable(true).setSortable(true);
Grid.Column<MetaDataColumn> columnTypeColumn = grid.addColumn(MetaDataColumn::getColumnType)
.setHeader("Column Type").setResizable(true).setSortable(true);
Grid.Column<MetaDataColumn> columnModifierColumn = grid.addColumn(MetaDataColumn::getColumnModifier)
.setHeader("Column Modifier").setResizable(true).setSortable(true);
Grid.Column<MetaDataColumn> columnOrderColumn = grid.addColumn(MetaDataColumn::getColumnOrder)
.setHeader("Column Order").setResizable(true).setSortable(true);
Grid.Column<MetaDataColumn> isShownColumn = grid.addComponentColumn(metaDataColumn -> createStatusIcon(metaDataColumn.getIsShown())).
setHeader("Anzeige?").setWidth("6rem").setSortable(true);
Grid.Column<MetaDataColumn> columnLabelColumn = grid.addColumn(MetaDataColumn::getColumnLabel)
.setHeader("Spaltenname").setResizable(true).setSortable(true);
Grid.Column<MetaDataColumn> showFilterColumn = grid.addComponentColumn(metaDataColumn -> createStatusIcon(metaDataColumn.getShowFilter())).
setHeader("Zeige Filter").setWidth("6rem").setSortable(true);
Grid.Column<MetaDataColumn> filterLabelColumn = grid.addColumn(MetaDataColumn::getFilterLabel)
.setHeader("Filter Name").setResizable(true).setSortable(true);
TextField searchField = new TextField();
@Getter
MetaDataForm form;
MetaDataService service;
private static class ColumnToggleContextMenu extends ContextMenu {
public ColumnToggleContextMenu(Component target) {
super(target);
setOpenOnClick(true);
}
void addColumnToggleItem(String label, Grid.Column<MetaDataColumn> column) {
MenuItem menuItem = this.addItem(label, e -> {
column.setVisible(e.getSource().isChecked());
});
menuItem.setCheckable(true);
menuItem.setChecked(column.isVisible());
menuItem.setKeepOpen(true);
}
}
public MetaDataView(MetaDataService service) {
this.service = service;
addClassName("metadata-view");
@@ -42,8 +101,17 @@ public class MetaDataView extends VerticalLayout {
private void configureGrid() {
grid.addClassName("metadata-grid");
grid.setSizeFull();
grid.setColumns("table.tableName", "columnName", "columnSyncName", "columnModifier", "columnOrder", "isShown", "showFilter");
//grid.setColumns("table.tableName", "columnName", "columnSyncName", "columnModifier", "columnOrder", "isShown", "columnLabel", "showFilter", "filterLabel");
grid.getColumns().forEach(col -> col.setAutoWidth(true));
idColumn.setVisible(false);
createdColumn.setVisible(false);
modifiedColumn.setVisible(false);
versionColumn.setVisible(false);
grid.setMultiSort(true);
List sortOrder = new ArrayList();
sortOrder.add(new GridSortOrder<MetaDataColumn>(tableColumn, SortDirection.ASCENDING));
sortOrder.add(new GridSortOrder<MetaDataColumn>(columnOrderColumn, SortDirection.ASCENDING));
grid.sort(sortOrder);
grid.asSingleSelect().addValueChangeListener(event -> editMetaData(event.getValue()));
}
@@ -56,6 +124,19 @@ public class MetaDataView extends VerticalLayout {
form.addCloseListener(e -> closeEditor());
}
private Icon createStatusIcon(boolean status) {
Icon icon;
if (status) {
icon = VaadinIcon.CHECK.create();
icon.getElement().getThemeList().add("badge success");
} else {
icon = VaadinIcon.CLOSE_SMALL.create();
icon.getElement().getThemeList().add("badge error");
}
icon.getStyle().set("padding", "var(--lumo-space-xs");
return icon;
}
private void saveMetaData(MetaDataForm.SaveEvent event) {
MetaDataColumn metaDataColumn = event.getMetaDataColumn();
service.saveMetaDataColumn(metaDataColumn);
@@ -79,8 +160,34 @@ public class MetaDataView extends VerticalLayout {
}
private HorizontalLayout getToolbar() {
Button addAuthorizationMaxtrixButton = new Button("Add Meta Data", click -> addMetaDataColumn());
HorizontalLayout toolbar = new HorizontalLayout(addAuthorizationMaxtrixButton);
searchField.setPlaceholder("Search");
searchField.setClearButtonVisible(true);
searchField.setPrefixComponent(new Icon(VaadinIcon.SEARCH));
searchField.setValueChangeMode(ValueChangeMode.EAGER);
searchField.addValueChangeListener(e -> updateList());
Button addMetaDataButton = new Button("Add Meta Data");
addMetaDataButton.addClickListener(click -> addMetaDataColumn());
Button menuButton = new Button("Show/Hide Columns");
menuButton.addThemeVariants(ButtonVariant.LUMO_TERTIARY);
MetaDataView.ColumnToggleContextMenu columnToggleContextMenu = new MetaDataView.ColumnToggleContextMenu(menuButton);
columnToggleContextMenu.addColumnToggleItem("ID", idColumn);
columnToggleContextMenu.addColumnToggleItem("Erstellt", createdColumn);
columnToggleContextMenu.addColumnToggleItem("Geändert", modifiedColumn);
columnToggleContextMenu.addColumnToggleItem(versionColumn.getHeaderText(), versionColumn);
columnToggleContextMenu.addColumnToggleItem(tableColumn.getHeaderText(), tableColumn);
columnToggleContextMenu.addColumnToggleItem(columnNameColumn.getHeaderText(), columnNameColumn);
columnToggleContextMenu.addColumnToggleItem(columnSyncNameColumn.getHeaderText(), columnSyncNameColumn);
columnToggleContextMenu.addColumnToggleItem(columnTypeColumn.getHeaderText(), columnTypeColumn);
columnToggleContextMenu.addColumnToggleItem(columnModifierColumn.getHeaderText(), columnModifierColumn);
columnToggleContextMenu.addColumnToggleItem(columnOrderColumn.getHeaderText(), columnOrderColumn);
columnToggleContextMenu.addColumnToggleItem(isShownColumn.getHeaderText(), isShownColumn);
columnToggleContextMenu.addColumnToggleItem(columnLabelColumn.getHeaderText(), columnLabelColumn);
columnToggleContextMenu.addColumnToggleItem(showFilterColumn.getHeaderText(), showFilterColumn);
columnToggleContextMenu.addColumnToggleItem(filterLabelColumn.getHeaderText(), filterLabelColumn);
HorizontalLayout toolbar = new HorizontalLayout(searchField, addMetaDataButton, menuButton);
toolbar.addClassName("toolbar");
return toolbar;
}
@@ -107,6 +214,6 @@ public class MetaDataView extends VerticalLayout {
}
private void updateList() {
grid.setItems(service.findAllMetaDataColumns());
grid.setItems(service.findAllMetaDataColumns(searchField.getValue()));
}
}
@@ -19,11 +19,11 @@ public class MediaFileService {
public List<MediaFile> findAllMediaFiles(String stringFilter) {
if (stringFilter == null || stringFilter.isEmpty()) {
log.info("Found " + mediaFileRepository.count()+ " entries");
log.debug("Found " + mediaFileRepository.count()+ " entries");
return mediaFileRepository.findAll();
} else {
List<MediaFile> results = mediaFileRepository.search(stringFilter);
log.info("Found " + results.size() + " entries");
log.debug("Found " + results.size() + " entries");
return results;
}
}