package com.psddev.cms.tool; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.stream.IntStream; import com.psddev.cms.db.ToolUi; import com.psddev.dari.db.Record; import com.psddev.dari.util.ClassFinder; import com.psddev.dari.util.TypeDefinition; import com.psddev.dari.util.UuidUtils; public class Dashboard extends Record { private static final String WIDGET_ID_NAME_PREFIX = Dashboard.class.getName() + "/"; private String name; private List<DashboardColumn> columns; @ToolUi.Tab("Tabs") private List<DashboardTab> tabs; /** * Creates a default dashboard containing instances of all classes that * implement {@link DefaultDashboardWidget}. * * @return Never {@code null}. */ public static Dashboard createDefaultDashboard() { Dashboard dashboard = new Dashboard(); List<DashboardColumn> columns = dashboard.getColumns(); ClassFinder.findConcreteClasses(DefaultDashboardWidget.class).forEach(c -> { DefaultDashboardWidget widget = TypeDefinition.getInstance(c).newInstance(); int columnIndex = widget.getColumnIndex(); widget.getState().setId(UuidUtils.createVersion3Uuid(WIDGET_ID_NAME_PREFIX + c.getName())); IntStream.range(0, columnIndex - columns.size() + 1) .forEach(i -> columns.add(new DashboardColumn())); columns.get(columnIndex) .getWidgets() .add(widget); }); double width = 1.0; for (DashboardColumn column : columns) { width /= 1.61803398875; column.setWidth(width); Collections.sort( column.getWidgets(), Comparator.comparingInt(w -> ((DefaultDashboardWidget) w).getWidgetIndex()) .thenComparing(w -> w.getClass().getName())); } return dashboard; } /** * @deprecated Use {@link #createDefaultDashboard()} instead. */ @Deprecated public static Dashboard getDefaultDashboard() { return createDefaultDashboard(); } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<DashboardColumn> getColumns() { if (columns == null) { columns = new ArrayList<>(); } return columns; } public void setColumns(List<DashboardColumn> columns) { this.columns = columns; } public List<DashboardTab> getTabs() { if (tabs == null) { tabs = new ArrayList<>(); } return tabs; } public void setTabs(List<DashboardTab> tabs) { this.tabs = tabs; } }