Refactor dashboard navigation, catalog grid, and API client
- Add sidebar dashboard navigation and support multiple dashboards - Extract catalog grid/form logic to reusable CatalogsGrid component - Add CatalogApiClient and DTOs for catalog CRUD operations - Define dashboards with JSON data sources (Default, CatalogsGrid) - Update configuration for dashboard and API endpoints - Improve styling and imports for modularity and maintainability
This commit is contained in:
52
DbFirst.API/Data/Dashboards/CatalogsGrid.xml
Normal file
52
DbFirst.API/Data/Dashboards/CatalogsGrid.xml
Normal file
@@ -0,0 +1,52 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Dashboard CurrencyCulture="de-DE" RequestParameters="false">
|
||||
<Title Text="Catalogs (Dashboard Grid)" />
|
||||
<DataSources>
|
||||
<JsonDataSource Name="Catalogs (API)" ComponentName="catalogsDataSource">
|
||||
<Source SourceType="DevExpress.DataAccess.Json.UriJsonSource" Uri="https://localhost:7204/api/catalogs" />
|
||||
</JsonDataSource>
|
||||
</DataSources>
|
||||
<Items>
|
||||
<Grid ComponentName="gridDashboardItem1" Name="Catalogs" DataSource="catalogsDataSource">
|
||||
<DataItems>
|
||||
<Dimension DataMember="Guid" DefaultId="DataItem0" />
|
||||
<Dimension DataMember="CatTitle" DefaultId="DataItem1" />
|
||||
<Dimension DataMember="CatString" DefaultId="DataItem2" />
|
||||
<Dimension DataMember="AddedWho" DefaultId="DataItem3" />
|
||||
<Dimension DataMember="AddedWhen" DefaultId="DataItem4" />
|
||||
<Dimension DataMember="ChangedWho" DefaultId="DataItem5" />
|
||||
<Dimension DataMember="ChangedWhen" DefaultId="DataItem6" />
|
||||
</DataItems>
|
||||
<GridColumns>
|
||||
<GridDimensionColumn Name="Id">
|
||||
<Dimension DefaultId="DataItem0" />
|
||||
</GridDimensionColumn>
|
||||
<GridDimensionColumn Name="Titel">
|
||||
<Dimension DefaultId="DataItem1" />
|
||||
</GridDimensionColumn>
|
||||
<GridDimensionColumn Name="String">
|
||||
<Dimension DefaultId="DataItem2" />
|
||||
</GridDimensionColumn>
|
||||
<GridDimensionColumn Name="Angelegt von">
|
||||
<Dimension DefaultId="DataItem3" />
|
||||
</GridDimensionColumn>
|
||||
<GridDimensionColumn Name="Angelegt am">
|
||||
<Dimension DefaultId="DataItem4" />
|
||||
</GridDimensionColumn>
|
||||
<GridDimensionColumn Name="Geändert von">
|
||||
<Dimension DefaultId="DataItem5" />
|
||||
</GridDimensionColumn>
|
||||
<GridDimensionColumn Name="Geändert am">
|
||||
<Dimension DefaultId="DataItem6" />
|
||||
</GridDimensionColumn>
|
||||
</GridColumns>
|
||||
<GridOptions />
|
||||
<ColumnFilterOptions />
|
||||
</Grid>
|
||||
</Items>
|
||||
<LayoutTree>
|
||||
<LayoutGroup Orientation="Vertical">
|
||||
<LayoutItem DashboardItem="gridDashboardItem1" />
|
||||
</LayoutGroup>
|
||||
</LayoutTree>
|
||||
</Dashboard>
|
||||
@@ -1,4 +1,103 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Dashboard CurrencyCulture="de-DE" RequestParameters="false">
|
||||
<Title Text="Default Dashboard" />
|
||||
<DataSources>
|
||||
<JsonDataSource Name="JSON Data Source (URL)" RootElement="Customers" ComponentName="jsonDataSource1">
|
||||
<Source SourceType="DevExpress.DataAccess.Json.UriJsonSource" Uri="https://raw.githubusercontent.com/DevExpress-Examples/DataSources/master/JSON/customers.json" />
|
||||
</JsonDataSource>
|
||||
<JsonDataSource Name="Catalogs (API)" ComponentName="catalogsDataSource">
|
||||
<Source SourceType="DevExpress.DataAccess.Json.UriJsonSource" Uri="https://localhost:7204/api/catalogs" />
|
||||
</JsonDataSource>
|
||||
</DataSources>
|
||||
<Items>
|
||||
<Grid ComponentName="gridDashboardItem1" Name="Grid 1" DataSource="jsonDataSource1">
|
||||
<DataItems>
|
||||
<Dimension DataMember="Address" DefaultId="DataItem0" />
|
||||
<Dimension DataMember="City" DefaultId="DataItem1" />
|
||||
<Dimension DataMember="CompanyName" DefaultId="DataItem2" />
|
||||
</DataItems>
|
||||
<GridColumns>
|
||||
<GridDimensionColumn>
|
||||
<Dimension DefaultId="DataItem0" />
|
||||
</GridDimensionColumn>
|
||||
<GridDimensionColumn>
|
||||
<Dimension DefaultId="DataItem1" />
|
||||
</GridDimensionColumn>
|
||||
<GridDimensionColumn>
|
||||
<Dimension DefaultId="DataItem2" />
|
||||
</GridDimensionColumn>
|
||||
</GridColumns>
|
||||
<GridOptions />
|
||||
<ColumnFilterOptions />
|
||||
</Grid>
|
||||
<Chart ComponentName="chartDashboardItem1" Name="Chart 1" DataSource="jsonDataSource1">
|
||||
<DataItems>
|
||||
<Measure DataMember="Address" SummaryType="Count" DefaultId="DataItem0" />
|
||||
<Measure DataMember="City" SummaryType="Count" DefaultId="DataItem1" />
|
||||
<Measure DataMember="CompanyName" SummaryType="Count" DefaultId="DataItem2" />
|
||||
</DataItems>
|
||||
<Panes>
|
||||
<Pane Name="Pane 1">
|
||||
<Series>
|
||||
<Simple>
|
||||
<Value DefaultId="DataItem0" />
|
||||
</Simple>
|
||||
<Simple>
|
||||
<Value DefaultId="DataItem1" />
|
||||
</Simple>
|
||||
<Simple>
|
||||
<Value DefaultId="DataItem2" />
|
||||
</Simple>
|
||||
</Series>
|
||||
</Pane>
|
||||
</Panes>
|
||||
</Chart>
|
||||
<Grid ComponentName="gridDashboardItem2" Name="Grid 2" DataSource="catalogsDataSource">
|
||||
<DataItems>
|
||||
<Measure DataMember="guid" DefaultId="DataItem0" />
|
||||
<Dimension DataMember="catTitle" DefaultId="DataItem1" />
|
||||
<Dimension DataMember="catString" DefaultId="DataItem2" />
|
||||
<Dimension DataMember="addedWhen" DefaultId="DataItem3" />
|
||||
<Dimension DataMember="addedWho" DefaultId="DataItem4" />
|
||||
<Dimension DataMember="changedWhen" DefaultId="DataItem5" />
|
||||
<Dimension DataMember="changedWho" DefaultId="DataItem6" />
|
||||
</DataItems>
|
||||
<GridColumns>
|
||||
<GridMeasureColumn>
|
||||
<Measure DefaultId="DataItem0" />
|
||||
</GridMeasureColumn>
|
||||
<GridDimensionColumn>
|
||||
<Dimension DefaultId="DataItem1" />
|
||||
</GridDimensionColumn>
|
||||
<GridDimensionColumn>
|
||||
<Dimension DefaultId="DataItem2" />
|
||||
</GridDimensionColumn>
|
||||
<GridDimensionColumn>
|
||||
<Dimension DefaultId="DataItem3" />
|
||||
</GridDimensionColumn>
|
||||
<GridDimensionColumn>
|
||||
<Dimension DefaultId="DataItem4" />
|
||||
</GridDimensionColumn>
|
||||
<GridDimensionColumn>
|
||||
<Dimension DefaultId="DataItem5" />
|
||||
</GridDimensionColumn>
|
||||
<GridDimensionColumn>
|
||||
<Dimension DefaultId="DataItem6" />
|
||||
</GridDimensionColumn>
|
||||
</GridColumns>
|
||||
<GridOptions />
|
||||
<ColumnFilterOptions />
|
||||
</Grid>
|
||||
</Items>
|
||||
<LayoutTree>
|
||||
<LayoutGroup>
|
||||
<LayoutGroup Orientation="Vertical">
|
||||
<LayoutGroup>
|
||||
<LayoutItem DashboardItem="gridDashboardItem1" />
|
||||
<LayoutItem DashboardItem="gridDashboardItem2" />
|
||||
</LayoutGroup>
|
||||
<LayoutItem DashboardItem="chartDashboardItem1" />
|
||||
</LayoutGroup>
|
||||
</LayoutGroup>
|
||||
</LayoutTree>
|
||||
</Dashboard>
|
||||
@@ -2,6 +2,7 @@ using DbFirst.API.Middleware;
|
||||
using DbFirst.Application;
|
||||
using DbFirst.Application.Repositories;
|
||||
using DbFirst.Domain;
|
||||
using DbFirst.Domain.Entities;
|
||||
using DbFirst.Infrastructure;
|
||||
using DbFirst.Infrastructure.Repositories;
|
||||
using DevExpress.AspNetCore;
|
||||
@@ -62,16 +63,68 @@ builder.Services.AddScoped<DashboardConfigurator>((IServiceProvider serviceProvi
|
||||
defaultDashboard.SaveToXml(defaultDashboardPath);
|
||||
}
|
||||
|
||||
var dashboardBaseUrl = builder.Configuration["Dashboard:BaseUrl"]
|
||||
?? builder.Configuration["ApiBaseUrl"]
|
||||
?? builder.Configuration["ASPNETCORE_URLS"]?.Split(';', StringSplitOptions.RemoveEmptyEntries).FirstOrDefault()
|
||||
?? "https://localhost:7204";
|
||||
|
||||
dashboardBaseUrl = dashboardBaseUrl.TrimEnd('/');
|
||||
|
||||
var catalogsGridDashboardPath = Path.Combine(dashboardsPath, "CatalogsGrid.xml");
|
||||
if (!File.Exists(catalogsGridDashboardPath))
|
||||
{
|
||||
var dashboard = new Dashboard();
|
||||
dashboard.Title.Text = "Catalogs (Dashboard Grid)";
|
||||
|
||||
var catalogDataSource = new DashboardJsonDataSource("Catalogs (API)")
|
||||
{
|
||||
ComponentName = "catalogsDataSource",
|
||||
JsonSource = new UriJsonSource(new Uri($"{dashboardBaseUrl}/api/catalogs"))
|
||||
};
|
||||
|
||||
dashboard.DataSources.Add(catalogDataSource);
|
||||
|
||||
var grid = new GridDashboardItem
|
||||
{
|
||||
DataSource = catalogDataSource,
|
||||
Name = "Catalogs"
|
||||
};
|
||||
|
||||
grid.Columns.Add(new GridDimensionColumn(new Dimension(nameof(VwmyCatalog.Guid))) { Name = "Id" });
|
||||
grid.Columns.Add(new GridDimensionColumn(new Dimension(nameof(VwmyCatalog.CatTitle))) { Name = "Titel" });
|
||||
grid.Columns.Add(new GridDimensionColumn(new Dimension(nameof(VwmyCatalog.CatString))) { Name = "String" });
|
||||
grid.Columns.Add(new GridDimensionColumn(new Dimension(nameof(VwmyCatalog.AddedWho))) { Name = "Angelegt von" });
|
||||
grid.Columns.Add(new GridDimensionColumn(new Dimension(nameof(VwmyCatalog.AddedWhen))) { Name = "Angelegt am" });
|
||||
grid.Columns.Add(new GridDimensionColumn(new Dimension(nameof(VwmyCatalog.ChangedWho))) { Name = "Geändert von" });
|
||||
grid.Columns.Add(new GridDimensionColumn(new Dimension(nameof(VwmyCatalog.ChangedWhen))) { Name = "Geändert am" });
|
||||
|
||||
dashboard.Items.Add(grid);
|
||||
|
||||
var layoutGroup = new DashboardLayoutGroup { Orientation = DashboardLayoutGroupOrientation.Vertical };
|
||||
layoutGroup.ChildNodes.Add(new DashboardLayoutItem(grid));
|
||||
dashboard.LayoutRoot = layoutGroup;
|
||||
|
||||
dashboard.SaveToXml(catalogsGridDashboardPath);
|
||||
}
|
||||
|
||||
DashboardConfigurator configurator = new DashboardConfigurator();
|
||||
// Register Dashboard Storage
|
||||
configurator.SetDashboardStorage(new DashboardFileStorage(dashboardsPath));
|
||||
// Create a sample JSON data source
|
||||
|
||||
DataSourceInMemoryStorage dataSourceStorage = new DataSourceInMemoryStorage();
|
||||
DashboardJsonDataSource jsonDataSourceUrl = new DashboardJsonDataSource("JSON Data Source (URL)");
|
||||
jsonDataSourceUrl.JsonSource = new UriJsonSource(
|
||||
new Uri("https://raw.githubusercontent.com/DevExpress-Examples/DataSources/master/JSON/customers.json"));
|
||||
jsonDataSourceUrl.RootElement = "Customers";
|
||||
dataSourceStorage.RegisterDataSource("jsonDataSourceUrl", jsonDataSourceUrl.SaveToXml());
|
||||
|
||||
var catalogsJsonDataSource = new DashboardJsonDataSource("Catalogs (API)")
|
||||
{
|
||||
ComponentName = "catalogsDataSource",
|
||||
JsonSource = new UriJsonSource(new Uri($"{dashboardBaseUrl}/api/catalogs"))
|
||||
};
|
||||
dataSourceStorage.RegisterDataSource(catalogsJsonDataSource.ComponentName, catalogsJsonDataSource.SaveToXml());
|
||||
dataSourceStorage.RegisterDataSource(catalogsJsonDataSource.Name, catalogsJsonDataSource.SaveToXml());
|
||||
|
||||
configurator.SetDataSourceStorage(dataSourceStorage);
|
||||
return configurator;
|
||||
});
|
||||
|
||||
@@ -2,6 +2,9 @@
|
||||
"ConnectionStrings": {
|
||||
"DefaultConnection": "Server=SDD-VMP04-SQL17\\DD_DEVELOP01;Database=DD_ECM;User Id=sa;Password=dd;TrustServerCertificate=True;"
|
||||
},
|
||||
"Dashboard": {
|
||||
"BaseUrl": "https://localhost:7204"
|
||||
},
|
||||
"Cors": {
|
||||
"AllowedOrigins": [
|
||||
"https://localhost:7276",
|
||||
|
||||
Reference in New Issue
Block a user