From c518e85a1d88ffe327a1f0cdf002f473e12ff87e Mon Sep 17 00:00:00 2001 From: akdalin Date: Tue, 11 Mar 2025 17:21:15 +0000 Subject: [PATCH 1/4] Create Tabs View, ViewComponent and Model --- .../ViewComponents/TabsViewComponent.cs | 18 ++++++++++ .../ViewModels/TabsViewModel.cs | 36 +++++++++++++++++++ .../Shared/Components/Tabs/Default.cshtml | 32 +++++++++++++++++ 3 files changed, 86 insertions(+) create mode 100644 DotnetViewComponents/ViewComponents/TabsViewComponent.cs create mode 100644 DotnetViewComponents/ViewModels/TabsViewModel.cs create mode 100644 DotnetViewComponents/Views/Shared/Components/Tabs/Default.cshtml diff --git a/DotnetViewComponents/ViewComponents/TabsViewComponent.cs b/DotnetViewComponents/ViewComponents/TabsViewComponent.cs new file mode 100644 index 0000000000..30b6dd0faa --- /dev/null +++ b/DotnetViewComponents/ViewComponents/TabsViewComponent.cs @@ -0,0 +1,18 @@ +namespace DotnetViewComponents.ViewComponents +{ + using System.Collections.Generic; + using Microsoft.AspNetCore.Mvc; + using DotnetViewComponents.ViewModels; + + public class TabsViewComponent : ViewComponent + { + public IViewComponentResult Invoke( + string title, + List tabsList) + { + var model = new TabsViewModel(title, tabsList); + + return View(model); + } + } +} diff --git a/DotnetViewComponents/ViewModels/TabsViewModel.cs b/DotnetViewComponents/ViewModels/TabsViewModel.cs new file mode 100644 index 0000000000..856f4a707d --- /dev/null +++ b/DotnetViewComponents/ViewModels/TabsViewModel.cs @@ -0,0 +1,36 @@ +namespace DotnetViewComponents.ViewModels +{ + public class TabsViewModel + { + public TabsViewModel( + string title, + List tabsList) + { + Title = title; + TabsList = tabsList; + } + + public string Title { get; set; } + public List TabsList { get; set; } + + } + + public class TabViewModel + { + public TabViewModel( + string name, + TableViewModel table, + bool isActive) + { + Name = name; + Table = table; + IsActive = isActive; + } + + public string Name { get; set; } + + public TableViewModel Table { get; set; } + + public bool IsActive { get; set; } + } +} diff --git a/DotnetViewComponents/Views/Shared/Components/Tabs/Default.cshtml b/DotnetViewComponents/Views/Shared/Components/Tabs/Default.cshtml new file mode 100644 index 0000000000..706c78fa59 --- /dev/null +++ b/DotnetViewComponents/Views/Shared/Components/Tabs/Default.cshtml @@ -0,0 +1,32 @@ +@using DotnetViewComponents.ViewModels +@model TabsViewModel + +
+

+ @Model.Title +

+ + + + @foreach (var tab in Model.TabsList) + { +
+ +
+ } + + +
From f1fcf465c7c8064cf8b2088a3652022849a5c682 Mon Sep 17 00:00:00 2001 From: akdalin Date: Wed, 16 Apr 2025 18:05:58 +0100 Subject: [PATCH 2/4] Update Tabs Model and Template to accept and render any other component fed to it. --- DotnetViewComponents/ViewModels/TabsViewModel.cs | 6 +++--- .../Views/Shared/Components/Tabs/Default.cshtml | 9 +++++---- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/DotnetViewComponents/ViewModels/TabsViewModel.cs b/DotnetViewComponents/ViewModels/TabsViewModel.cs index 856f4a707d..bb52c7d97c 100644 --- a/DotnetViewComponents/ViewModels/TabsViewModel.cs +++ b/DotnetViewComponents/ViewModels/TabsViewModel.cs @@ -19,17 +19,17 @@ public class TabViewModel { public TabViewModel( string name, - TableViewModel table, + object contentModel, bool isActive) { Name = name; - Table = table; + ContentModel = contentModel; IsActive = isActive; } public string Name { get; set; } - public TableViewModel Table { get; set; } + public object ContentModel { get; set; } public bool IsActive { get; set; } } diff --git a/DotnetViewComponents/Views/Shared/Components/Tabs/Default.cshtml b/DotnetViewComponents/Views/Shared/Components/Tabs/Default.cshtml index 706c78fa59..5df0046e76 100644 --- a/DotnetViewComponents/Views/Shared/Components/Tabs/Default.cshtml +++ b/DotnetViewComponents/Views/Shared/Components/Tabs/Default.cshtml @@ -21,10 +21,11 @@ @foreach (var tab in Model.TabsList) {
- + @{ + var modelType = tab.ContentModel.GetType(); + var viewComponentName = modelType.Name.Replace("ViewModel", ""); + } + @await Component.InvokeAsync(viewComponentName, tab.ContentModel)
} From 01dd3061a5144d39fe89dd1c6872dabd5a92f637 Mon Sep 17 00:00:00 2001 From: akdalin Date: Thu, 24 Apr 2025 14:41:38 +0100 Subject: [PATCH 3/4] Replace TabViewModel object with Generic delegate function to accept any ViewComponents, HTML and Partials as input input and render them as plain html --- DotnetViewComponents/ViewModels/TabsViewModel.cs | 8 +++++--- .../Views/Shared/Components/Tabs/Default.cshtml | 6 +----- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/DotnetViewComponents/ViewModels/TabsViewModel.cs b/DotnetViewComponents/ViewModels/TabsViewModel.cs index bb52c7d97c..2093b53557 100644 --- a/DotnetViewComponents/ViewModels/TabsViewModel.cs +++ b/DotnetViewComponents/ViewModels/TabsViewModel.cs @@ -1,3 +1,5 @@ +using Microsoft.AspNetCore.Html; + namespace DotnetViewComponents.ViewModels { public class TabsViewModel @@ -19,17 +21,17 @@ public class TabViewModel { public TabViewModel( string name, - object contentModel, + Func content, bool isActive) { Name = name; - ContentModel = contentModel; + Content = content; IsActive = isActive; } public string Name { get; set; } - public object ContentModel { get; set; } + public Func Content { get; set; } public bool IsActive { get; set; } } diff --git a/DotnetViewComponents/Views/Shared/Components/Tabs/Default.cshtml b/DotnetViewComponents/Views/Shared/Components/Tabs/Default.cshtml index 5df0046e76..b8aa618f16 100644 --- a/DotnetViewComponents/Views/Shared/Components/Tabs/Default.cshtml +++ b/DotnetViewComponents/Views/Shared/Components/Tabs/Default.cshtml @@ -21,11 +21,7 @@ @foreach (var tab in Model.TabsList) {
- @{ - var modelType = tab.ContentModel.GetType(); - var viewComponentName = modelType.Name.Replace("ViewModel", ""); - } - @await Component.InvokeAsync(viewComponentName, tab.ContentModel) + @tab.Content(null)
} From 69ae5515c2a102229e13e30ab0ae7ad834cea18e Mon Sep 17 00:00:00 2001 From: akdalin Date: Thu, 24 Apr 2025 14:56:33 +0100 Subject: [PATCH 4/4] Remove Table View, ViewComponent and Model --- .../ViewComponents/TableViewComponent.cs | 21 --------- .../ViewModels/TableViewModel.cs | 45 ------------------- .../Shared/Components/Table/Default.cshtml | 34 -------------- 3 files changed, 100 deletions(-) delete mode 100644 DotnetViewComponents/ViewComponents/TableViewComponent.cs delete mode 100644 DotnetViewComponents/ViewModels/TableViewModel.cs delete mode 100644 DotnetViewComponents/Views/Shared/Components/Table/Default.cshtml diff --git a/DotnetViewComponents/ViewComponents/TableViewComponent.cs b/DotnetViewComponents/ViewComponents/TableViewComponent.cs deleted file mode 100644 index bb8af6dc31..0000000000 --- a/DotnetViewComponents/ViewComponents/TableViewComponent.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace DotnetViewComponents.ViewComponents -{ - using System.Collections.Generic; - using Microsoft.AspNetCore.Mvc; - using DotnetViewComponents.ViewModels; - - public class TableViewComponent : ViewComponent - { - public IViewComponentResult Invoke( - string title, - List headers, - List> rows, - bool isResponsive = false, - bool hasNumericData = false) - { - var model = new TableViewModel(title, headers, rows, isResponsive, hasNumericData); - - return View(model); - } - } -} diff --git a/DotnetViewComponents/ViewModels/TableViewModel.cs b/DotnetViewComponents/ViewModels/TableViewModel.cs deleted file mode 100644 index fce7e29cac..0000000000 --- a/DotnetViewComponents/ViewModels/TableViewModel.cs +++ /dev/null @@ -1,45 +0,0 @@ -namespace DotnetViewComponents.ViewModels -{ - public class TableViewModel - { - public TableViewModel( - string title, - List headers, - List> rows, - bool isResponsive = false, - bool hasNumericData = false) - { - Title = title; - Headers = headers; - Rows = rows; - IsResponsive = isResponsive; - HasNumericData = hasNumericData; - } - - public string Title { get; set; } - - public List Headers { get; set; } - - public List> Rows { get; set; } - - public bool IsResponsive { get; set; } - - public bool HasNumericData { get; set; } - - } - - public class TableColumnModel - { - public TableColumnModel( - string header, - string column) - { - Header = header; - Column = column; - } - - public string Header { get; set; } - - public string Column { get; set; } - } -} diff --git a/DotnetViewComponents/Views/Shared/Components/Table/Default.cshtml b/DotnetViewComponents/Views/Shared/Components/Table/Default.cshtml deleted file mode 100644 index d9255aedf6..0000000000 --- a/DotnetViewComponents/Views/Shared/Components/Table/Default.cshtml +++ /dev/null @@ -1,34 +0,0 @@ -@using DotnetViewComponents.ViewModels -@model TableViewModel - - - - - - @foreach (var header in Model.Headers) - { - - } - - - - @foreach (var row in Model.Rows) - { - - @foreach (var col in row) - { - - } - - } - -
@Model.Title
- @header -
- @if (Model.IsResponsive) - { - - } - - @col.Column -