Skip to content

Commit 56ae487

Browse files
Started implementing new CRUD logic.
1 parent 0830b0f commit 56ae487

File tree

113 files changed

+3839
-35
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

113 files changed

+3839
-35
lines changed

DotNetElements.sln

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,18 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DotNetElements.Web.AspNetCo
1515
EndProject
1616
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotNetElements.Extensions.Icons", "src\DotNetElements.Extensions.Icons\DotNetElements.Extensions.Icons.csproj", "{12509DFE-E26F-4B58-84C3-3E099AD94082}"
1717
EndProject
18+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotNetElements.CrudExample.New", "samples\DotNetElements.CrudExample.New\DotNetElements.CrudExample.New.csproj", "{193CD6D5-5848-453C-9212-74C8E49C591A}"
19+
EndProject
20+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotNetElements.Core.Test.New", "test\DotNetElements.Core.Test.New\DotNetElements.Core.Test.New.csproj", "{9682F9AA-9C35-46F0-B409-C340E7810068}"
21+
EndProject
22+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotNetElements.Core.EntityFramework", "src\DotNetElements.Core.EntityFramework\DotNetElements.Core.EntityFramework.csproj", "{4A8B7E80-A540-4ADD-AFDA-EEAF5025D309}"
23+
EndProject
24+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotNetElements.Core.EntityFramework.Shared", "src\DotNetElements.Core.EntityFramework.Shared\DotNetElements.Core.EntityFramework.Shared.csproj", "{A0BE2255-04B9-433D-8373-6EE39790A097}"
25+
EndProject
26+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotNetElements.Core.Shared", "src\DotNetElements.Core.Shared\DotNetElements.Core.Shared.csproj", "{CF2E9181-2D12-4C25-8B38-A0F6537B4504}"
27+
EndProject
28+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotNetElements.Core.EntityFramework.Example", "src\DotNetElements.Core.EntityFramework.Example\DotNetElements.Core.EntityFramework.Example.csproj", "{BF5DC3E7-EF11-4ABA-9E2C-214562FFAEBF}"
29+
EndProject
1830
Global
1931
GlobalSection(SolutionConfigurationPlatforms) = preSolution
2032
Debug|Any CPU = Debug|Any CPU
@@ -45,6 +57,30 @@ Global
4557
{12509DFE-E26F-4B58-84C3-3E099AD94082}.Debug|Any CPU.Build.0 = Debug|Any CPU
4658
{12509DFE-E26F-4B58-84C3-3E099AD94082}.Release|Any CPU.ActiveCfg = Release|Any CPU
4759
{12509DFE-E26F-4B58-84C3-3E099AD94082}.Release|Any CPU.Build.0 = Release|Any CPU
60+
{193CD6D5-5848-453C-9212-74C8E49C591A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
61+
{193CD6D5-5848-453C-9212-74C8E49C591A}.Debug|Any CPU.Build.0 = Debug|Any CPU
62+
{193CD6D5-5848-453C-9212-74C8E49C591A}.Release|Any CPU.ActiveCfg = Release|Any CPU
63+
{193CD6D5-5848-453C-9212-74C8E49C591A}.Release|Any CPU.Build.0 = Release|Any CPU
64+
{9682F9AA-9C35-46F0-B409-C340E7810068}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
65+
{9682F9AA-9C35-46F0-B409-C340E7810068}.Debug|Any CPU.Build.0 = Debug|Any CPU
66+
{9682F9AA-9C35-46F0-B409-C340E7810068}.Release|Any CPU.ActiveCfg = Release|Any CPU
67+
{9682F9AA-9C35-46F0-B409-C340E7810068}.Release|Any CPU.Build.0 = Release|Any CPU
68+
{4A8B7E80-A540-4ADD-AFDA-EEAF5025D309}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
69+
{4A8B7E80-A540-4ADD-AFDA-EEAF5025D309}.Debug|Any CPU.Build.0 = Debug|Any CPU
70+
{4A8B7E80-A540-4ADD-AFDA-EEAF5025D309}.Release|Any CPU.ActiveCfg = Release|Any CPU
71+
{4A8B7E80-A540-4ADD-AFDA-EEAF5025D309}.Release|Any CPU.Build.0 = Release|Any CPU
72+
{A0BE2255-04B9-433D-8373-6EE39790A097}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
73+
{A0BE2255-04B9-433D-8373-6EE39790A097}.Debug|Any CPU.Build.0 = Debug|Any CPU
74+
{A0BE2255-04B9-433D-8373-6EE39790A097}.Release|Any CPU.ActiveCfg = Release|Any CPU
75+
{A0BE2255-04B9-433D-8373-6EE39790A097}.Release|Any CPU.Build.0 = Release|Any CPU
76+
{CF2E9181-2D12-4C25-8B38-A0F6537B4504}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
77+
{CF2E9181-2D12-4C25-8B38-A0F6537B4504}.Debug|Any CPU.Build.0 = Debug|Any CPU
78+
{CF2E9181-2D12-4C25-8B38-A0F6537B4504}.Release|Any CPU.ActiveCfg = Release|Any CPU
79+
{CF2E9181-2D12-4C25-8B38-A0F6537B4504}.Release|Any CPU.Build.0 = Release|Any CPU
80+
{BF5DC3E7-EF11-4ABA-9E2C-214562FFAEBF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
81+
{BF5DC3E7-EF11-4ABA-9E2C-214562FFAEBF}.Debug|Any CPU.Build.0 = Debug|Any CPU
82+
{BF5DC3E7-EF11-4ABA-9E2C-214562FFAEBF}.Release|Any CPU.ActiveCfg = Release|Any CPU
83+
{BF5DC3E7-EF11-4ABA-9E2C-214562FFAEBF}.Release|Any CPU.Build.0 = Release|Any CPU
4884
EndGlobalSection
4985
GlobalSection(SolutionProperties) = preSolution
5086
HideSolutionNode = FALSE
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"version": 1,
3+
"isRoot": true,
4+
"tools": {
5+
"dotnet-ef": {
6+
"version": "8.0.3",
7+
"commands": [
8+
"dotnet-ef"
9+
]
10+
}
11+
}
12+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
4+
<head>
5+
<meta charset="utf-8" />
6+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
7+
<base href="/" />
8+
<link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700&display=swap" rel="stylesheet" />
9+
<link href="_content/MudBlazor/MudBlazor.min.css" rel="stylesheet" />
10+
<link rel="stylesheet" href="app.css" />
11+
<link rel="icon" type="image/png" href="favicon.png" />
12+
<HeadOutlet @rendermode="@InteractiveServer" />
13+
</head>
14+
15+
<body>
16+
<Routes @rendermode="@InteractiveServer" />
17+
<script src="_framework/blazor.web.js"></script>
18+
<script src="_content/MudBlazor/MudBlazor.min.js"></script>
19+
</body>
20+
21+
</html>
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
@using DotNetElements.CrudExample.Modules.BlogPostModule
2+
@using DotNetElements.CrudExample.Modules.TagModule
3+
4+
<MudDialog>
5+
<DialogContent>
6+
<MudTextField @bind-Value="BlogPost.Title" Label="Title" />
7+
<MudSelect T="TagModel" Label="Tags" MultiSelection="true" @bind-SelectedValues="selectedTags">
8+
@foreach (TagModel tag in SelectableTags)
9+
{
10+
<MudSelectItem T="TagModel" Value="@tag">@tag.Label</MudSelectItem>
11+
}
12+
</MudSelect>
13+
</DialogContent>
14+
<DialogActions>
15+
<MudButton OnClick="OnCancel">Cancel</MudButton>
16+
<MudButton Color="Color.Primary" OnClick="OnSave">Save</MudButton>
17+
</DialogActions>
18+
</MudDialog>
19+
20+
@code
21+
{
22+
[CascadingParameter]
23+
IMudDialogInstance DialogInstance { get; set; } = default!;
24+
25+
[Parameter, EditorRequired]
26+
public EditBlogPostModel BlogPost { get; set; } = default!;
27+
28+
[Parameter, EditorRequired]
29+
public IReadOnlyList<TagModel> SelectableTags { get; set; } = default!;
30+
31+
private IEnumerable<TagModel>? selectedTags;
32+
33+
protected override void OnParametersSet()
34+
{
35+
selectedTags = new HashSet<TagModel>(SelectableTags.Where(tag => BlogPost.Tags.Any(selectedTag => selectedTag.Id == tag.Id)));
36+
}
37+
38+
private void OnSave()
39+
{
40+
BlogPost.Tags = selectedTags!.ToList();
41+
42+
DialogInstance.Close(DialogResult.Ok(true));
43+
}
44+
45+
private void OnCancel()
46+
{
47+
DialogInstance.Cancel();
48+
}
49+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<MudDialog>
2+
<TitleContent>
3+
<MudText Typo="Typo.h6">
4+
<MudIcon Icon="@Icons.Material.Filled.DeleteForever" Class="mr-3 mb-n1" />
5+
@DialogInstance.Title
6+
</MudText>
7+
</TitleContent>
8+
<DialogContent>
9+
<MudTextField Value="@ItemValue" Label="@ItemLabel" ReadOnly="true" />
10+
</DialogContent>
11+
<DialogActions>
12+
<MudButton OnClick="OnCancel">Cancel</MudButton>
13+
<MudButton Color="Color.Error" OnClick="OnConfirm">Delete</MudButton>
14+
</DialogActions>
15+
</MudDialog>
16+
17+
@code
18+
{
19+
[CascadingParameter]
20+
IMudDialogInstance DialogInstance { get; set; } = default!;
21+
22+
[Parameter, EditorRequired]
23+
public string ItemValue { get; set; } = default!;
24+
25+
[Parameter, EditorRequired]
26+
public string ItemLabel { get; set; } = default!;
27+
28+
private void OnConfirm()
29+
{
30+
DialogInstance.Close(DialogResult.Ok(true));
31+
}
32+
33+
private void OnCancel()
34+
{
35+
DialogInstance.Cancel();
36+
}
37+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
@inherits CrudEditDialog<TagModel, EditTagModel>
2+
3+
@using DotNetElements.Web.Blazor
4+
@using DotNetElements.CrudExample.Modules.TagModule
5+
6+
@{
7+
DialogContent =
8+
@<EditForm EditContext="@EditContext">
9+
<DneDataAnnotationsValidator />
10+
<MudTextField @bind-Value="Model.Label" Label="Label" />
11+
</EditForm>;
12+
}
13+
14+
@{
15+
base.BuildRenderTree(__builder);
16+
}
17+
18+
@code
19+
{
20+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
@using DotNetElements.CrudExample.Modules.TagModule
2+
3+
<MudDialog>
4+
<DialogContent>
5+
<MudTextField @bind-Value="Tag.Label" Label="Label" />
6+
</DialogContent>
7+
<DialogActions>
8+
<MudButton OnClick="OnCancel">Cancel</MudButton>
9+
<MudButton Color="Color.Primary" OnClick="OnSave">Save</MudButton>
10+
</DialogActions>
11+
</MudDialog>
12+
13+
@code
14+
{
15+
[CascadingParameter]
16+
IMudDialogInstance DialogInstance { get; set; } = default!;
17+
18+
[Parameter, EditorRequired]
19+
public EditTagModel Tag { get; set; } = default!;
20+
21+
private void OnSave()
22+
{
23+
DialogInstance.Close(DialogResult.Ok(true));
24+
}
25+
26+
private void OnCancel()
27+
{
28+
DialogInstance.Cancel();
29+
}
30+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
@* @inherits CrudTable<Guid, TagModel, AuditedModelDetails, EditTagModel, TagDialog>
2+
3+
@using DotNetElements.Web.MudBlazor
4+
@using DotNetElements.CrudExample.Modules.TagModule
5+
6+
<MudSimpleTable Style="overflow-x: auto;">
7+
<thead>
8+
<tr>
9+
<th>Label</th>
10+
<th style="width: 140px;">Actions</th>
11+
</tr>
12+
</thead>
13+
<tbody>
14+
@foreach (ModelWithDetails<TagModel, AuditedModelDetails> context in TableEntries)
15+
{
16+
<tr>
17+
<td>@context.Value.Label</td>
18+
<td class="py-0 pl-2" style="width: 140px;">
19+
<MudIconButton OnClick="() => OnEditEntry(context)" Class="pa-1" Icon="@Icons.Material.Outlined.Edit" Color="Color.Warning" />
20+
<MudIconButton OnClick="() => OnDeleteEntry(context, context.Value.Label)" Class="pa-1" Icon="@Icons.Material.Outlined.Delete" Color="Color.Error" />
21+
<MudIconButton OnClick="() => OnShowEntryDetails(context)" Class="pa-1" Icon="@Icons.Material.Outlined.Info" Color="Color.Default" />
22+
</td>
23+
</tr>
24+
25+
@if (context.DetailsShown && context.Details is not null)
26+
{
27+
<tr>
28+
<td colspan="100">
29+
<MudGrid Spacing="2">
30+
<MudItem xs="12">
31+
<MudStack Spacing="1">
32+
<MudText Typo="Typo.caption"><b>ID</b></MudText>
33+
<MudText Typo="Typo.caption">@context.Value.Id</MudText>
34+
</MudStack>
35+
</MudItem>
36+
<MudItem xs="4">
37+
<MudStack Spacing="1">
38+
<MudText Typo="Typo.caption"><b>Creation Time</b></MudText>
39+
<MudText Typo="Typo.caption">@context.Details.CreationTime</MudText>
40+
</MudStack>
41+
</MudItem>
42+
<MudItem xs="4">
43+
<MudStack Spacing="1">
44+
<MudText Typo="Typo.caption"><b>Last Modification Time</b></MudText>
45+
<MudText Typo="Typo.caption">@context.Details.LastModificationTime</MudText>
46+
</MudStack>
47+
</MudItem>
48+
</MudGrid>
49+
</td>
50+
</tr>
51+
}
52+
}
53+
</tbody>
54+
</MudSimpleTable>
55+
56+
@code
57+
{
58+
protected override CrudTableOptions OnConfiguring()
59+
{
60+
return new CrudTableOptions("api/tags");
61+
}
62+
} *@
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
@using DotNetElements.Web.Blazor
2+
@inherits LayoutComponentBase
3+
4+
<MudProviders @bind-DarkModeActive="@darkModeActive" />
5+
6+
<MudLayout>
7+
<MudAppBar Elevation="1">
8+
<MudIconButton Icon="@Icons.Material.Filled.Menu" Color="Color.Inherit" Edge="Edge.Start" OnClick="@OnToggleDrawer" />
9+
<MudSpacer />
10+
<ThemeToggleButton @bind-DarkModeActive="darkModeActive" />
11+
<MudIconButton Icon="@Icons.Custom.Brands.GitHub" Color="Color.Inherit" Edge="Edge.End" />
12+
</MudAppBar>
13+
<MudDrawer @bind-Open="@drawerOpen">
14+
<MudDrawerHeader>
15+
<MudText Typo="Typo.h5" Class="ml-3">Blazor CRUD</MudText>
16+
</MudDrawerHeader>
17+
<NavMenu />
18+
</MudDrawer>
19+
<MudMainContent>
20+
<MudContainer MaxWidth="MaxWidth.Medium" Class="py-8">
21+
@Body
22+
</MudContainer>
23+
</MudMainContent>
24+
</MudLayout>
25+
26+
@code
27+
{
28+
private bool drawerOpen = true;
29+
private bool darkModeActive;
30+
31+
private void OnToggleDrawer()
32+
{
33+
drawerOpen = !drawerOpen;
34+
}
35+
36+
private void OnToggleDarkMode()
37+
{
38+
darkModeActive = !darkModeActive;
39+
}
40+
}

0 commit comments

Comments
 (0)