From 9bf9b9264501f69d99af4c251e57ca0012140960 Mon Sep 17 00:00:00 2001 From: bryanrcarlson Date: Wed, 20 Dec 2023 15:47:50 -0800 Subject: [PATCH 01/22] Bumped version --- Caf.Midden.Cli/Caf.Midden.Cli.csproj | 6 +++--- Caf.Midden.Wasm/Caf.Midden.Wasm.csproj | 6 ++++-- Caf.Midden.Wasm/Services/StateContainer.cs | 10 ++++++++-- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/Caf.Midden.Cli/Caf.Midden.Cli.csproj b/Caf.Midden.Cli/Caf.Midden.Cli.csproj index cc3cc05..364800f 100644 --- a/Caf.Midden.Cli/Caf.Midden.Cli.csproj +++ b/Caf.Midden.Cli/Caf.Midden.Cli.csproj @@ -5,10 +5,10 @@ net6.0 true enable - 0.3.1.0 - 0.3.1.0 + 0.4.0 + 0.4.0 MiddenCli - 0.3.1 + 0.4-dev.1 https://github.com/cafincubator/midden MiddenCli true diff --git a/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj b/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj index 72e8b24..8b5844e 100644 --- a/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj +++ b/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj @@ -1,9 +1,11 @@ - + net6.0 service-worker-assets.js - 0.3 + 0.4.0 + 0.4.0-dev.1 + diff --git a/Caf.Midden.Wasm/Services/StateContainer.cs b/Caf.Midden.Wasm/Services/StateContainer.cs index a9cb12e..6c5f8f9 100644 --- a/Caf.Midden.Wasm/Services/StateContainer.cs +++ b/Caf.Midden.Wasm/Services/StateContainer.cs @@ -62,10 +62,16 @@ public void UpdateCatalog( public StateContainer() { - this.AssemblyVersion = - Assembly.GetExecutingAssembly() + var informationalVersion = + Assembly.GetEntryAssembly() .GetCustomAttribute() .InformationalVersion; + + // Added because a GUID was appended to the end for unknown reasons + if (informationalVersion.Contains("+")) + informationalVersion = informationalVersion.Split("+")[0]; + + this.AssemblyVersion = informationalVersion; } public event Action StateChanged; From b0b172bb3b04f63dc534c21f7d565e28eac17702 Mon Sep 17 00:00:00 2001 From: bryanrcarlson Date: Wed, 20 Dec 2023 15:51:39 -0800 Subject: [PATCH 02/22] MOving to net8 --- Caf.Midden.Cli.Tests/Caf.Midden.Cli.Tests.csproj | 2 +- Caf.Midden.Cli/Caf.Midden.Cli.csproj | 4 ++-- Caf.Midden.Core.Tests/Caf.Midden.Core.Tests.csproj | 2 +- Caf.Midden.Core/Caf.Midden.Core.csproj | 2 +- Caf.Midden.Wasm/Caf.Midden.Wasm.csproj | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Caf.Midden.Cli.Tests/Caf.Midden.Cli.Tests.csproj b/Caf.Midden.Cli.Tests/Caf.Midden.Cli.Tests.csproj index 10adb42..26c63e4 100644 --- a/Caf.Midden.Cli.Tests/Caf.Midden.Cli.Tests.csproj +++ b/Caf.Midden.Cli.Tests/Caf.Midden.Cli.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 false diff --git a/Caf.Midden.Cli/Caf.Midden.Cli.csproj b/Caf.Midden.Cli/Caf.Midden.Cli.csproj index 364800f..af06c2d 100644 --- a/Caf.Midden.Cli/Caf.Midden.Cli.csproj +++ b/Caf.Midden.Cli/Caf.Midden.Cli.csproj @@ -2,13 +2,13 @@ Exe - net6.0 + net8.0 true enable 0.4.0 0.4.0 MiddenCli - 0.4-dev.1 + 0.4-dev.0 https://github.com/cafincubator/midden MiddenCli true diff --git a/Caf.Midden.Core.Tests/Caf.Midden.Core.Tests.csproj b/Caf.Midden.Core.Tests/Caf.Midden.Core.Tests.csproj index 05dd565..d96a9dc 100644 --- a/Caf.Midden.Core.Tests/Caf.Midden.Core.Tests.csproj +++ b/Caf.Midden.Core.Tests/Caf.Midden.Core.Tests.csproj @@ -1,7 +1,7 @@ - net6.0 + net8.0 false diff --git a/Caf.Midden.Core/Caf.Midden.Core.csproj b/Caf.Midden.Core/Caf.Midden.Core.csproj index 5f9c84a..d327898 100644 --- a/Caf.Midden.Core/Caf.Midden.Core.csproj +++ b/Caf.Midden.Core/Caf.Midden.Core.csproj @@ -1,7 +1,7 @@  - net6.0 + net8.0 diff --git a/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj b/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj index 8b5844e..0add3fe 100644 --- a/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj +++ b/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj @@ -1,10 +1,10 @@  - net6.0 + net8.0 service-worker-assets.js 0.4.0 - 0.4.0-dev.1 + 0.4.0-dev.0 From c66f892d381039264c611de4504dd19ad26bc3f1 Mon Sep 17 00:00:00 2001 From: bryanrcarlson Date: Wed, 20 Dec 2023 16:09:03 -0800 Subject: [PATCH 03/22] Upgraded to net8 --- .../Caf.Midden.Cli.Tests.csproj | 18 +++++--------- Caf.Midden.Cli/Caf.Midden.Cli.csproj | 16 ++++--------- .../Caf.Midden.Core.Tests.csproj | 20 ++++++---------- Caf.Midden.Core/Caf.Midden.Core.csproj | 7 ++---- Caf.Midden.Wasm/Caf.Midden.Wasm.csproj | 24 +++++++------------ 5 files changed, 28 insertions(+), 57 deletions(-) diff --git a/Caf.Midden.Cli.Tests/Caf.Midden.Cli.Tests.csproj b/Caf.Midden.Cli.Tests/Caf.Midden.Cli.Tests.csproj index 26c63e4..2c2e857 100644 --- a/Caf.Midden.Cli.Tests/Caf.Midden.Cli.Tests.csproj +++ b/Caf.Midden.Cli.Tests/Caf.Midden.Cli.Tests.csproj @@ -1,28 +1,23 @@ - - + net8.0 - false - - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all - - PreserveNewest @@ -67,5 +62,4 @@ PreserveNewest - - + \ No newline at end of file diff --git a/Caf.Midden.Cli/Caf.Midden.Cli.csproj b/Caf.Midden.Cli/Caf.Midden.Cli.csproj index af06c2d..ff7959e 100644 --- a/Caf.Midden.Cli/Caf.Midden.Cli.csproj +++ b/Caf.Midden.Cli/Caf.Midden.Cli.csproj @@ -1,5 +1,4 @@  - Exe net8.0 @@ -13,24 +12,19 @@ MiddenCli true - - - - - + + + + - - PreserveNewest - - - + \ No newline at end of file diff --git a/Caf.Midden.Core.Tests/Caf.Midden.Core.Tests.csproj b/Caf.Midden.Core.Tests/Caf.Midden.Core.Tests.csproj index d96a9dc..70a850f 100644 --- a/Caf.Midden.Core.Tests/Caf.Midden.Core.Tests.csproj +++ b/Caf.Midden.Core.Tests/Caf.Midden.Core.Tests.csproj @@ -1,29 +1,24 @@ - - + net8.0 - false - - - - - + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all - - PreserveNewest @@ -50,5 +45,4 @@ PreserveNewest - - + \ No newline at end of file diff --git a/Caf.Midden.Core/Caf.Midden.Core.csproj b/Caf.Midden.Core/Caf.Midden.Core.csproj index d327898..3e22d61 100644 --- a/Caf.Midden.Core/Caf.Midden.Core.csproj +++ b/Caf.Midden.Core/Caf.Midden.Core.csproj @@ -1,11 +1,8 @@  - net8.0 - - + - - + \ No newline at end of file diff --git a/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj b/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj index 0add3fe..777eb36 100644 --- a/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj +++ b/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj @@ -1,31 +1,25 @@  - net8.0 service-worker-assets.js 0.4.0 0.4.0-dev.0 - - - - - - - - - + + + + + + + - - - PreserveNewest @@ -61,11 +55,9 @@ PreserveNewest - PreserveNewest - - + \ No newline at end of file From 71914dd23c2824d4b3310df4bf64f323b58dfc93 Mon Sep 17 00:00:00 2001 From: bryanrcarlson Date: Thu, 21 Dec 2023 15:07:36 -0800 Subject: [PATCH 04/22] Added tags, bumped version --- Caf.Midden.Wasm/Caf.Midden.Wasm.csproj | 2 +- Caf.Midden.Wasm/Pages/CatalogTags.razor | 9 +- Caf.Midden.Wasm/Pages/CatalogTags.razor.cs | 72 +++++++++++ Caf.Midden.Wasm/Pages/Index.razor | 10 +- .../Shared/FilteredCatalogTagViewer.razor | 56 +++++++++ .../Shared/FilteredCatalogTagViewer.razor.cs | 114 ++++++++++++++++++ Caf.Midden.Wasm/Shared/MainLayout.razor | 6 +- Caf.Midden.Wasm/Shared/MetadataEditor.razor | 3 +- 8 files changed, 257 insertions(+), 15 deletions(-) create mode 100644 Caf.Midden.Wasm/Pages/CatalogTags.razor.cs create mode 100644 Caf.Midden.Wasm/Shared/FilteredCatalogTagViewer.razor create mode 100644 Caf.Midden.Wasm/Shared/FilteredCatalogTagViewer.razor.cs diff --git a/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj b/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj index 777eb36..09e43ea 100644 --- a/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj +++ b/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj @@ -3,7 +3,7 @@ net8.0 service-worker-assets.js 0.4.0 - 0.4.0-dev.0 + 0.4.0-dev.1 diff --git a/Caf.Midden.Wasm/Pages/CatalogTags.razor b/Caf.Midden.Wasm/Pages/CatalogTags.razor index 503a5bb..05eebdc 100644 --- a/Caf.Midden.Wasm/Pages/CatalogTags.razor +++ b/Caf.Midden.Wasm/Pages/CatalogTags.razor @@ -2,12 +2,9 @@ @inject Services.StateContainer State
+ -

Coming soon...

-
- -@code { - -} \ No newline at end of file + + \ No newline at end of file diff --git a/Caf.Midden.Wasm/Pages/CatalogTags.razor.cs b/Caf.Midden.Wasm/Pages/CatalogTags.razor.cs new file mode 100644 index 0000000..c3a74d1 --- /dev/null +++ b/Caf.Midden.Wasm/Pages/CatalogTags.razor.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Caf.Midden.Core.Models.v0_2; +using Microsoft.AspNetCore.Components; +using AntDesign; + +namespace Caf.Midden.Wasm.Pages +{ + public partial class CatalogTags + { + /* + Dictionary TopDatasetTags { get; set; } + Dictionary TopVariableTags { get; set; } + + EmbeddedProperty Property(int span, int offset) => new() { Span = span, Offset = offset }; + + protected override void OnInitialized() + { + State.StateChanged += async (source, property) + => await StateChanged(source, property); + + if (State?.Catalog != null) + SetPageData(); + } + + private async Task StateChanged( + ComponentBase source, + string property) + { + if (source != this) + { + if (property == "UpdateCatalog") + { + SetPageData(); + } + + await InvokeAsync(StateHasChanged); + } + } + + private void SetPageData() + { + List DatasetTags = new List(); + List VariableTags = new List(); + + foreach (Metadata meta in State.Catalog.Metadatas) + { + // Get tags from all datasets and variables + DatasetTags = DatasetTags.Concat(meta.Dataset.Tags).ToList(); + VariableTags = VariableTags.Concat(meta.Dataset.Variables + .SelectMany(v => v.Tags)).ToList(); + } + + this.TopDatasetTags = DatasetTags.GroupBy(s => s) + .ToDictionary(g => g.Key, g => g.Count()) + .OrderByDescending(d => d.Value) + .ToDictionary(d => d.Key, d => d.Value); + this.TopVariableTags = VariableTags.GroupBy(s => s) + .ToDictionary(g => g.Key, g => g.Count()) + .OrderByDescending(d => d.Value) + .ToDictionary(d => d.Key, d => d.Value); + } + public void Dispose() + { + State.StateChanged -= async (source, property) + => await StateChanged(source, property); + } + */ + } +} diff --git a/Caf.Midden.Wasm/Pages/Index.razor b/Caf.Midden.Wasm/Pages/Index.razor index 4eab5b3..ccba967 100644 --- a/Caf.Midden.Wasm/Pages/Index.razor +++ b/Caf.Midden.Wasm/Pages/Index.razor @@ -76,17 +76,17 @@ - Recent Projects <small><a href="catalog/projects"><Icon Type="double-right" Theme="outline" /></a></small> + Recent Projects <small><a href="catalog/projects"><Icon Type="double-right" Theme="outline" /></a></small> + - Recent Datasets <small><a href="catalog/datasets"><Icon Type="double-right" Theme="outline" /></a></small> - + Recent Datasets <small><a href="catalog/datasets"><Icon Type="double-right" Theme="outline" /></a></small> + - - Stats for Nerds + Stats for Nerds diff --git a/Caf.Midden.Wasm/Shared/FilteredCatalogTagViewer.razor b/Caf.Midden.Wasm/Shared/FilteredCatalogTagViewer.razor new file mode 100644 index 0000000..cba212f --- /dev/null +++ b/Caf.Midden.Wasm/Shared/FilteredCatalogTagViewer.razor @@ -0,0 +1,56 @@ +@inject Caf.Midden.Wasm.Services.StateContainer State + +@if (this.ShowHeader) +{ + Tags +} + +@if (State.Catalog != null && this.ShowSearch) +{ + + + + + + + +} + +@if (FilteredDatasetTags != null && FilteredVariableTags != null) +{ + + + +
Dataset Tags
+ + + + + @item.Key @item.Value + + + +
+
+ + +
Variable Tags
+ + + + @item.Key @item.Value + + + +
+
+
+} +else { + +} \ No newline at end of file diff --git a/Caf.Midden.Wasm/Shared/FilteredCatalogTagViewer.razor.cs b/Caf.Midden.Wasm/Shared/FilteredCatalogTagViewer.razor.cs new file mode 100644 index 0000000..eb9cce9 --- /dev/null +++ b/Caf.Midden.Wasm/Shared/FilteredCatalogTagViewer.razor.cs @@ -0,0 +1,114 @@ +using AntDesign; +using Caf.Midden.Core.Models.v0_2; +using Caf.Midden.Wasm.Shared.Modals; +using Markdig; +using Microsoft.AspNetCore.Components; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Caf.Midden.Wasm.Shared +{ + public partial class FilteredCatalogTagViewer : IDisposable + { + [Parameter] + public bool ShowSearch { get; set; } = true; + + [Parameter] + public bool ShowHeader { get; set; } = true; + + EmbeddedProperty Property(int span, int offset) => new() { Span = span, Offset = offset }; + + + Dictionary BaseDatasetTags { get; set; } + Dictionary BaseVariableTags { get; set; } + Dictionary FilteredDatasetTags { get; set; } + Dictionary FilteredVariableTags { get; set; } + + public string SearchTerm { get; set; } + + protected override void OnInitialized() + { + State.StateChanged += async (source, property) + => await StateChanged(source, property); + + if (State?.Catalog != null) + { + SetBaseTags(); + InitializeFilteredTags(); + } + } + + private async Task StateChanged( + ComponentBase source, + string property) + { + if (source != this) + { + if (property == "UpdateCatalog") + { + SetBaseTags(); + InitializeFilteredTags(); + } + + await InvokeAsync(StateHasChanged); + } + } + + private void SetBaseTags() + { + List DatasetTags = new List(); + List VariableTags = new List(); + + foreach (Metadata meta in State.Catalog.Metadatas) + { + // Get tags from all datasets and variables + DatasetTags = DatasetTags.Concat(meta.Dataset.Tags).ToList(); + VariableTags = VariableTags.Concat(meta.Dataset.Variables + .SelectMany(v => v.Tags)).ToList(); + } + + this.BaseDatasetTags = DatasetTags.GroupBy(s => s) + .ToDictionary(g => g.Key, g => g.Count()) + .OrderByDescending(d => d.Value) + .ToDictionary(d => d.Key, d => d.Value); + this.BaseVariableTags = VariableTags.GroupBy(s => s) + .ToDictionary(g => g.Key, g => g.Count()) + .OrderByDescending(d => d.Value) + .ToDictionary(d => d.Key, d => d.Value); + } + private void InitializeFilteredTags() + { + this.FilteredDatasetTags = this.BaseDatasetTags; + this.FilteredVariableTags = this.BaseVariableTags; + } + private void SearchHandler() + { + if (string.IsNullOrWhiteSpace(SearchTerm)) + { + InitializeFilteredTags(); + } + else + { + FilteredDatasetTags = this.BaseDatasetTags + .Where(t => t.Key.ToLower().Contains(SearchTerm.ToLower())) + .ToDictionary() + .OrderByDescending(d => d.Value) + .ToDictionary(); + + FilteredVariableTags = this.BaseVariableTags + .Where(t => t.Key.ToLower().Contains(SearchTerm.ToLower())) + .ToDictionary() + .OrderByDescending(d => d.Value) + .ToDictionary(); + } + } + + public void Dispose() + { + State.StateChanged -= async (source, property) + => await StateChanged(source, property); + } + } +} diff --git a/Caf.Midden.Wasm/Shared/MainLayout.razor b/Caf.Midden.Wasm/Shared/MainLayout.razor index cbb3286..3d69097 100644 --- a/Caf.Midden.Wasm/Shared/MainLayout.razor +++ b/Caf.Midden.Wasm/Shared/MainLayout.razor @@ -26,7 +26,7 @@ CollapsedWidth="0"> @@ -45,6 +45,10 @@ Projects + + + Tags + diff --git a/Caf.Midden.Wasm/Shared/MetadataEditor.razor b/Caf.Midden.Wasm/Shared/MetadataEditor.razor index 2debec9..a0a05dc 100644 --- a/Caf.Midden.Wasm/Shared/MetadataEditor.razor +++ b/Caf.Midden.Wasm/Shared/MetadataEditor.razor @@ -24,7 +24,7 @@ Layout="@FormLayout.Vertical" ValidateMode="@FormValidateMode.Rules" @ref="form"> - + - From a2c0d26c85cfdff61f6f369adc9289e8581e1776 Mon Sep 17 00:00:00 2001 From: bryanrcarlson Date: Thu, 21 Dec 2023 15:59:17 -0800 Subject: [PATCH 05/22] cleanup --- Caf.Midden.Wasm/Pages/CatalogTags.razor.cs | 72 ---------------------- 1 file changed, 72 deletions(-) delete mode 100644 Caf.Midden.Wasm/Pages/CatalogTags.razor.cs diff --git a/Caf.Midden.Wasm/Pages/CatalogTags.razor.cs b/Caf.Midden.Wasm/Pages/CatalogTags.razor.cs deleted file mode 100644 index c3a74d1..0000000 --- a/Caf.Midden.Wasm/Pages/CatalogTags.razor.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -using Caf.Midden.Core.Models.v0_2; -using Microsoft.AspNetCore.Components; -using AntDesign; - -namespace Caf.Midden.Wasm.Pages -{ - public partial class CatalogTags - { - /* - Dictionary TopDatasetTags { get; set; } - Dictionary TopVariableTags { get; set; } - - EmbeddedProperty Property(int span, int offset) => new() { Span = span, Offset = offset }; - - protected override void OnInitialized() - { - State.StateChanged += async (source, property) - => await StateChanged(source, property); - - if (State?.Catalog != null) - SetPageData(); - } - - private async Task StateChanged( - ComponentBase source, - string property) - { - if (source != this) - { - if (property == "UpdateCatalog") - { - SetPageData(); - } - - await InvokeAsync(StateHasChanged); - } - } - - private void SetPageData() - { - List DatasetTags = new List(); - List VariableTags = new List(); - - foreach (Metadata meta in State.Catalog.Metadatas) - { - // Get tags from all datasets and variables - DatasetTags = DatasetTags.Concat(meta.Dataset.Tags).ToList(); - VariableTags = VariableTags.Concat(meta.Dataset.Variables - .SelectMany(v => v.Tags)).ToList(); - } - - this.TopDatasetTags = DatasetTags.GroupBy(s => s) - .ToDictionary(g => g.Key, g => g.Count()) - .OrderByDescending(d => d.Value) - .ToDictionary(d => d.Key, d => d.Value); - this.TopVariableTags = VariableTags.GroupBy(s => s) - .ToDictionary(g => g.Key, g => g.Count()) - .OrderByDescending(d => d.Value) - .ToDictionary(d => d.Key, d => d.Value); - } - public void Dispose() - { - State.StateChanged -= async (source, property) - => await StateChanged(source, property); - } - */ - } -} From 3158d69d5534ac660c0896c83fedba117c9b9029 Mon Sep 17 00:00:00 2001 From: bryanrcarlson Date: Thu, 5 Dec 2024 13:12:44 -0800 Subject: [PATCH 06/22] Fixed issue where crawler would crash instead of ignoring poorly formated files --- .../Services/AzureDataLakeCrawler.cs | 37 +++++++++++-------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/Caf.Midden.Cli/Services/AzureDataLakeCrawler.cs b/Caf.Midden.Cli/Services/AzureDataLakeCrawler.cs index ff2eb10..6cb7840 100644 --- a/Caf.Midden.Cli/Services/AzureDataLakeCrawler.cs +++ b/Caf.Midden.Cli/Services/AzureDataLakeCrawler.cs @@ -99,26 +99,33 @@ public List GetMetadatas( foreach (var fileName in fileNames) { - // Get file contents as json string - DataLakeFileClient fileClient = - fileSystemClient.GetFileClient(fileName); + try + { + // Get file contents as json string + DataLakeFileClient fileClient = + fileSystemClient.GetFileClient(fileName); - Response fileContents = fileClient.Read(); + Response fileContents = fileClient.Read(); - string json; - using (MemoryStream ms = new MemoryStream()) - { - fileContents.Value.Content.CopyTo(ms); - json = Encoding.UTF8.GetString(ms.ToArray()); - } + string json; + using (MemoryStream ms = new MemoryStream()) + { + fileContents.Value.Content.CopyTo(ms); + json = Encoding.UTF8.GetString(ms.ToArray()); + } - // Parse json string and add relative path to Dataset - Metadata metadata = parser.Parse(json); + // Parse json string and add relative path to Dataset + Metadata metadata = parser.Parse(json); - string filePath = fileClient.Path.Replace(MIDDEN_FILE_EXTENSION, ""); - metadata.Dataset.DatasetPath = filePath; + string filePath = fileClient.Path.Replace(MIDDEN_FILE_EXTENSION, ""); + metadata.Dataset.DatasetPath = filePath; - metadatas.Add(metadata); + metadatas.Add(metadata); + } + catch (Exception ex) + { + Console.WriteLine($"Error parsing file: {fileName}, reason: {ex}"); + } } return metadatas; From 77b399fada9ce2a8a27c37e69dc844ed900cefb8 Mon Sep 17 00:00:00 2001 From: bryanrcarlson Date: Thu, 5 Dec 2024 13:49:38 -0800 Subject: [PATCH 07/22] Updated dotnet to 9 and all nuget packages --- .../Caf.Midden.Cli.Tests.csproj | 11 ++++++----- .../LocalFileSystemCrawlerTests.cs | 1 - Caf.Midden.Cli/Caf.Midden.Cli.csproj | 11 ++++++----- .../Caf.Midden.Core.Tests.csproj | 12 ++++++------ Caf.Midden.Core/Caf.Midden.Core.csproj | 4 ++-- Caf.Midden.Wasm/Caf.Midden.Wasm.csproj | 19 ++++++++++--------- 6 files changed, 30 insertions(+), 28 deletions(-) diff --git a/Caf.Midden.Cli.Tests/Caf.Midden.Cli.Tests.csproj b/Caf.Midden.Cli.Tests/Caf.Midden.Cli.Tests.csproj index 2c2e857..f6d8359 100644 --- a/Caf.Midden.Cli.Tests/Caf.Midden.Cli.Tests.csproj +++ b/Caf.Midden.Cli.Tests/Caf.Midden.Cli.Tests.csproj @@ -1,16 +1,17 @@  - net8.0 + net9.0 false - - - + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Caf.Midden.Cli.Tests/LocalFileSystemCrawlerTests.cs b/Caf.Midden.Cli.Tests/LocalFileSystemCrawlerTests.cs index 8123fc5..6075735 100644 --- a/Caf.Midden.Cli.Tests/LocalFileSystemCrawlerTests.cs +++ b/Caf.Midden.Cli.Tests/LocalFileSystemCrawlerTests.cs @@ -1,7 +1,6 @@ using Caf.Midden.Cli.Services; using Caf.Midden.Core.Models.v0_2; using Caf.Midden.Core.Services.Metadata; -using NuGet.Frameworks; using System; using System.Collections.Generic; using System.Linq; diff --git a/Caf.Midden.Cli/Caf.Midden.Cli.csproj b/Caf.Midden.Cli/Caf.Midden.Cli.csproj index ff7959e..b22bc66 100644 --- a/Caf.Midden.Cli/Caf.Midden.Cli.csproj +++ b/Caf.Midden.Cli/Caf.Midden.Cli.csproj @@ -1,7 +1,7 @@  Exe - net8.0 + net9.0 true enable 0.4.0 @@ -13,11 +13,12 @@ true - - - - + + + + + diff --git a/Caf.Midden.Core.Tests/Caf.Midden.Core.Tests.csproj b/Caf.Midden.Core.Tests/Caf.Midden.Core.Tests.csproj index 70a850f..69119f6 100644 --- a/Caf.Midden.Core.Tests/Caf.Midden.Core.Tests.csproj +++ b/Caf.Midden.Core.Tests/Caf.Midden.Core.Tests.csproj @@ -1,17 +1,17 @@  - net8.0 + net9.0 false - - - - + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/Caf.Midden.Core/Caf.Midden.Core.csproj b/Caf.Midden.Core/Caf.Midden.Core.csproj index 3e22d61..1b03f16 100644 --- a/Caf.Midden.Core/Caf.Midden.Core.csproj +++ b/Caf.Midden.Core/Caf.Midden.Core.csproj @@ -1,8 +1,8 @@  - net8.0 + net9.0 - + \ No newline at end of file diff --git a/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj b/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj index 09e43ea..f961e79 100644 --- a/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj +++ b/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj @@ -1,18 +1,19 @@  - net8.0 + net9.0 service-worker-assets.js 0.4.0 - 0.4.0-dev.1 + 0.4.0-dev.2 - - - - - - - + + + + + + + + From 447ff6e00b7adf303e89a7ff0ccf73e3a08c7d09 Mon Sep 17 00:00:00 2001 From: bryanrcarlson Date: Thu, 5 Dec 2024 15:38:57 -0800 Subject: [PATCH 08/22] Added diagram library --- Caf.Midden.Wasm/Caf.Midden.Wasm.csproj | 1 + Caf.Midden.Wasm/wwwroot/index.html | 7 ++++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj b/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj index f961e79..bfbb592 100644 --- a/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj +++ b/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj @@ -14,6 +14,7 @@ + diff --git a/Caf.Midden.Wasm/wwwroot/index.html b/Caf.Midden.Wasm/wwwroot/index.html index 999ca97..25194b0 100644 --- a/Caf.Midden.Wasm/wwwroot/index.html +++ b/Caf.Midden.Wasm/wwwroot/index.html @@ -17,7 +17,9 @@ - + + + Midden: Research Data Catalog + + + From 48e156a5ac475b4e029277bd7df3b6dec15404e3 Mon Sep 17 00:00:00 2001 From: bryanrcarlson Date: Thu, 5 Dec 2024 16:30:47 -0800 Subject: [PATCH 09/22] Unfinished, but got first diagram to display --- Caf.Midden.Wasm/Shared/MetadataDetails.razor | 12 ++++ .../Shared/MetadataLineageDiagram.razor | 56 +++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 Caf.Midden.Wasm/Shared/MetadataLineageDiagram.razor diff --git a/Caf.Midden.Wasm/Shared/MetadataDetails.razor b/Caf.Midden.Wasm/Shared/MetadataDetails.razor index 95fb791..da7dd43 100644 --- a/Caf.Midden.Wasm/Shared/MetadataDetails.razor +++ b/Caf.Midden.Wasm/Shared/MetadataDetails.razor @@ -73,6 +73,18 @@ + + + + + Lineage Diagram + + + + + + + diff --git a/Caf.Midden.Wasm/Shared/MetadataLineageDiagram.razor b/Caf.Midden.Wasm/Shared/MetadataLineageDiagram.razor new file mode 100644 index 0000000..06c6d9f --- /dev/null +++ b/Caf.Midden.Wasm/Shared/MetadataLineageDiagram.razor @@ -0,0 +1,56 @@ +@using Blazor.Diagrams +@using Blazor.Diagrams.Core.Anchors +@using Blazor.Diagrams.Core.Models +@using Blazor.Diagrams.Core.PathGenerators; +@using Blazor.Diagrams.Core.Routers; +@using Blazor.Diagrams.Options; +@using Blazor.Diagrams.Components; + +
+ + + +
+ +@code { + private BlazorDiagram Diagram { get; set; } = null!; + + protected override void OnInitialized() + { + var options = new BlazorDiagramOptions + { + AllowMultiSelection = true, + Zoom = + { + Enabled = false, + }, + Links = + { + DefaultRouter = new NormalRouter(), + DefaultPathGenerator = new SmoothPathGenerator() + }, + }; + + Diagram = new BlazorDiagram(options); + + var firstNode = Diagram.Nodes.Add(new NodeModel(position: new Blazor.Diagrams.Core.Geometry.Point(50, 50)) + { + Title = "Node 1" + }); + var secondNode = Diagram.Nodes.Add(new NodeModel(position: new Blazor.Diagrams.Core.Geometry.Point(200, 100)) + { + Title = "Node 2" + }); + var leftPort = secondNode.AddPort(PortAlignment.Left); + var rightPort = secondNode.AddPort(PortAlignment.Right); + + // The connection point will be the intersection of + // a line going from the target to the center of the source + var sourceAnchor = new ShapeIntersectionAnchor(firstNode); + // The connection point will be the port's position + var targetAnchor = new SinglePortAnchor(leftPort); + var link = Diagram.Links.Add(new LinkModel(sourceAnchor, targetAnchor)); + } + + +} From 431e2f516a0076c9dd06a159d544b0654f65dde1 Mon Sep 17 00:00:00 2001 From: bryanrcarlson Date: Wed, 11 Dec 2024 13:55:05 -0800 Subject: [PATCH 10/22] Added test datasets with parentDatasets, got initial functionality working, need to style it now --- Caf.Midden.Wasm/Shared/MetadataDetails.razor | 4 +- .../Shared/MetadataLineageDiagram.razor | 89 +++++++--- .../MetadataLineageDiagramViewModel.cs | 163 ++++++++++++++++++ Caf.Midden.Wasm/wwwroot/catalog.json | 91 ++++++++++ 4 files changed, 321 insertions(+), 26 deletions(-) create mode 100644 Caf.Midden.Wasm/Shared/ViewModels/MetadataLineageDiagramViewModel.cs diff --git a/Caf.Midden.Wasm/Shared/MetadataDetails.razor b/Caf.Midden.Wasm/Shared/MetadataDetails.razor index da7dd43..c99c0ba 100644 --- a/Caf.Midden.Wasm/Shared/MetadataDetails.razor +++ b/Caf.Midden.Wasm/Shared/MetadataDetails.razor @@ -74,13 +74,13 @@
- + Lineage Diagram - + diff --git a/Caf.Midden.Wasm/Shared/MetadataLineageDiagram.razor b/Caf.Midden.Wasm/Shared/MetadataLineageDiagram.razor index 06c6d9f..2b2a0d3 100644 --- a/Caf.Midden.Wasm/Shared/MetadataLineageDiagram.razor +++ b/Caf.Midden.Wasm/Shared/MetadataLineageDiagram.razor @@ -5,51 +5,92 @@ @using Blazor.Diagrams.Core.Routers; @using Blazor.Diagrams.Options; @using Blazor.Diagrams.Components; +@using Caf.Midden.Wasm.Services +@using Caf.Midden.Wasm.Shared.ViewModels; + +@inject Caf.Midden.Wasm.Services.StateContainer State
- - - + + +
@code { - private BlazorDiagram Diagram { get; set; } = null!; + [Parameter] + public Dataset dataset { get; set; } + + private MetadataLineageDiagramViewModel viewModel; + + + private BlazorDiagram _Diagram { get; set; } = null!; protected override void OnInitialized() { + // TODO: Create a component to style thoe nodes: https://blazor-diagrams.zhaytam.com/documentation/nodes-customization + + viewModel = + new MetadataLineageDiagramViewModel(dataset, State.Catalog); + + var node = viewModel.GetDatasetNode(); var options = new BlazorDiagramOptions { - AllowMultiSelection = true, + AllowMultiSelection = false, Zoom = { - Enabled = false, + Enabled = true, }, Links = { DefaultRouter = new NormalRouter(), DefaultPathGenerator = new SmoothPathGenerator() - }, + } }; - Diagram = new BlazorDiagram(options); + _Diagram = new BlazorDiagram(options); - var firstNode = Diagram.Nodes.Add(new NodeModel(position: new Blazor.Diagrams.Core.Geometry.Point(50, 50)) - { - Title = "Node 1" - }); - var secondNode = Diagram.Nodes.Add(new NodeModel(position: new Blazor.Diagrams.Core.Geometry.Point(200, 100)) + CreateNodes(node); + + _Diagram.ZoomToFit(); + } + + private void CreateNodes(DatasetNode datasetNode, NodeModel thisNode = null) + { + // Create a new node if one wasn't passed through recursion + if(thisNode == null) + { + thisNode = _Diagram.Nodes.Add( + new NodeModel( + position: new Blazor.Diagrams.Core.Geometry.Point(50, 50)) + { + Title = $"{datasetNode.Name}" + }); + } + + //var leftPortThisNode = thisNode.AddPort(PortAlignment.Left); + + int currentRow = 1; + int rowHeight = 50; + + foreach(var parent in datasetNode.Parents) + { + var parentNode = _Diagram.Nodes.Add(new NodeModel(position: new Blazor.Diagrams.Core.Geometry.Point(-50, (currentRow*rowHeight))) + { + Title = $"{parent.Name}" + }); + //var rightPortParentNode = parentNode.AddPort(PortAlignment.Right); + //var parentAnchor = new SinglePortAnchor(rightPortParentNode); + //var childAnchor = new SinglePortAnchor(leftPortThisNode); + var parentToChildLink = _Diagram.Links.Add(new LinkModel(parentNode, thisNode)); + parentToChildLink.TargetMarker = LinkMarker.Arrow; + + currentRow += 1; + + if(parent.Parents.Count > 0) { - Title = "Node 2" - }); - var leftPort = secondNode.AddPort(PortAlignment.Left); - var rightPort = secondNode.AddPort(PortAlignment.Right); - - // The connection point will be the intersection of - // a line going from the target to the center of the source - var sourceAnchor = new ShapeIntersectionAnchor(firstNode); - // The connection point will be the port's position - var targetAnchor = new SinglePortAnchor(leftPort); - var link = Diagram.Links.Add(new LinkModel(sourceAnchor, targetAnchor)); + CreateNodes(parent, parentNode); + } + } } diff --git a/Caf.Midden.Wasm/Shared/ViewModels/MetadataLineageDiagramViewModel.cs b/Caf.Midden.Wasm/Shared/ViewModels/MetadataLineageDiagramViewModel.cs new file mode 100644 index 0000000..23397b1 --- /dev/null +++ b/Caf.Midden.Wasm/Shared/ViewModels/MetadataLineageDiagramViewModel.cs @@ -0,0 +1,163 @@ +using Caf.Midden.Core.Models.v0_2; +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; + +namespace Caf.Midden.Wasm.Shared.ViewModels +{ + public class MetadataLineageDiagramViewModel(Dataset dataset, Catalog catalog) + { + private readonly Dataset _Dataset = dataset; + private readonly Catalog _Catalog = catalog; + + private const string MIDDEN_DATASET_FLAG = "[Midden]"; + private const int MAX_NUMBER_CONNECTIONS = 20; + + // Tracks the number of connections (NOT number of parent). This is to prevent infinite loops. + private int _NumberConnections = 0; + private DatasetNode _Node; + public DatasetNode GetDatasetNode() + { + if (_Node == null) + { + _NumberConnections = 0; + _Node = InitializeDatasetNode(_Dataset); + } + + return _Node; + } + private DatasetNode InitializeDatasetNode(Dataset dataset) + { + var node = new DatasetNode(dataset.Name, GetRelativeUrlForDataset(dataset)); + + foreach (var parentDatasetString in dataset.ParentDatasets) + { + var parentName = ""; + var parentUrl = ""; + + if (parentDatasetString.StartsWith(MIDDEN_DATASET_FLAG)) + { + string potentialUrl = parentDatasetString.Replace(MIDDEN_DATASET_FLAG, ""); + if (Uri.IsWellFormedUriString(potentialUrl, UriKind.Absolute)) + { + // It's a Midden dataset with a valid url, so set URL and look up dataset in catalog + parentUrl = potentialUrl; + + var parentDataset = GetDatasetFromCatalogByUrl(parentUrl); + if (parentDataset != null) + { + _NumberConnections += 1; + + // Check if we've already reached max connections + // If so, stop recursive + if (_NumberConnections > MAX_NUMBER_CONNECTIONS) + { + return node; + } + + // Recursive time! Call Initialize on this one + var parentNode = InitializeDatasetNode(parentDataset); + + node.AddParent(parentNode); + } + else + { + // Failed to find the dataset in the catalog, so just set name as url + parentName = parentUrl; + + var parentNode = new DatasetNode(parentName, parentUrl); + _NumberConnections += 1; + node.AddParent(parentNode); + } + + + + } + else + { + // It's not a valid url, so set the name to it and don't link anything + parentName = potentialUrl; + + var parentNode = new DatasetNode(parentName, parentUrl); + _NumberConnections += 1; + node.AddParent(parentNode); + } + } + else + { + parentName = parentDatasetString; + + if (Uri.IsWellFormedUriString(parentDatasetString, UriKind.Absolute)) + { + parentUrl = parentDatasetString; + } + + var parentNode = new DatasetNode(parentName, parentUrl); + _NumberConnections += 1; + node.AddParent(parentNode); + } + } + + return node; + } + + private string GetRelativeUrlForDataset(Dataset dataset) + { + var result = $"/{dataset.Zone}/{dataset.Project}/{dataset.Name}"; + + return result; + } + private Dataset GetDatasetFromCatalogByUrl(string url) + { + // Parse the url, assume: {base url}/catalog/dataset/{zone}/{project}/{dataset} + // NOTE: Url structure may change, so this is on weak footing + + Uri uri = new Uri(url); + string pathOnly = uri.AbsolutePath; + string[] segments = pathOnly.Split('/'); + + if(segments.Length != 6) + { + // Not in Midden format + return null; + } + + string zone = segments[3]; + string project = segments[4]; + string name = segments[5]; + + Dataset dataset = _Catalog.Metadatas.Where( + m => m.Dataset.Zone == zone && + m.Dataset.Project == project && + m.Dataset.Name == name).FirstOrDefault().Dataset; + + return dataset; + } + } + + public class DatasetNode + { + private List _Parents = new List(); + //private List _Children = new List(); + + public string Name { get; set; } + public string Url { get; set; } + + public DatasetNode(string name, string url) + { + this.Name = name; + this.Url = url; + } + + public IReadOnlyCollection Parents + { + get { return _Parents.AsReadOnly(); } + } + + public void AddParent(DatasetNode node) + { + _Parents.Add(node); + } + } +} diff --git a/Caf.Midden.Wasm/wwwroot/catalog.json b/Caf.Midden.Wasm/wwwroot/catalog.json index bf68a57..5ec7d81 100644 --- a/Caf.Midden.Wasm/wwwroot/catalog.json +++ b/Caf.Midden.Wasm/wwwroot/catalog.json @@ -3582,6 +3582,97 @@ ], "derivedWorks": [] } + }, + { + "schemaVersion": "v0.2", + "creationDate": "2024-12-11T01:00:00.757Z", + "modifiedDate": "2024-12-11T01:00:00.757Z", + "dataset": { + "zone": "Raw", + "project": "TestProject", + "name": "RawDataset", + "description": "This is raw data and a parent to all", + "tags": [], + "contacts": [ + { + "name": "User1" + } + ], + "methods": [], + "variables": [], + "derivedWorks": [], + "parentDatasets": [] + } + }, + { + "schemaVersion": "v0.2", + "creationDate": "2024-12-11T01:00:00.757Z", + "modifiedDate": "2024-12-11T01:00:41.318Z", + "dataset": { + "zone": "Raw", + "project": "AnotherTestProject", + "name": "AnotherRawDataset", + "description": "This is raw data outside of TestProject", + "tags": [], + "contacts": [ + { + "name": "User1" + } + ], + "methods": [], + "variables": [], + "derivedWorks": [], + "parentDatasets": [] + } + }, + { + "schemaVersion": "v0.2", + "creationDate": "2024-12-11T01:00:00.757Z", + "modifiedDate": "2024-12-11T01:03:11.813Z", + "dataset": { + "zone": "Work", + "project": "TestProject", + "name": "WorkingDataFromTwoRaw", + "description": "This dataset is created from two raw datasets", + "tags": [], + "contacts": [ + { + "name": "User2" + } + ], + "methods": [], + "variables": [], + "derivedWorks": [], + "parentDatasets": [ + "[Midden]https://localhost:5001/catalog/datasets/Raw/TestProject/RawDataset", + "[Midden]https://localhost:5001/catalog/datasets/Raw/AnotherTestProject/AnotherRawDataset" + ] + } + }, + { + "schemaVersion": "v0.2", + "creationDate": "2024-12-11T01:00:00.757Z", + "modifiedDate": "2024-12-11T01:07:06.382Z", + "dataset": { + "zone": "Production", + "project": "TestProject", + "name": "ProductionFromWorkingAndExternal", + "description": "This dataset is created from working dataset and an external reference dataset", + "tags": [], + "contacts": [ + { + "name": "User2" + } + ], + "methods": [], + "variables": [], + "derivedWorks": [], + "parentDatasets": [ + "https://github.com/cafltar/Midden_AzureFunctionRunCollator/blob/main/README.md", + "Armendariz, Gerardo; Coffin, Alisa W.; Archer, David; Arthur, Dan; Bean, Alycia; Browning, Dawn; Carlson, Bryan; Clark, Pat; Flynn, Colton; Goslee, Sarah; Hall, Veronica; Holifield Collins, Chandra; Hsieh, Hsun-Yi; Johnson, Jane M. F.; Kaplan, Nicole; Kautz, Mark; Kettler, Tim; King, Kevin; Moglen, Glenn; Schmer, Marty; Sclater, Vivienne; Spiegal, Sheri; Stark, Patrick; Stinner, Jedediah; Sudduth, Ken; Teet, Stephen; Wagner, Steve; Yasarer, Lindsey (2021). The Long-Term Agroecosystem Research (LTAR) Network Standard GIS Data Layers, 2020 version. Ag Data Commons. https://doi.org/10.15482/USDA.ADC/1521161", + "[Midden]https://localhost:5001/catalog/datasets/Work/TestProject/WorkingDataFromTwoRaw" + ] + } } ] } \ No newline at end of file From d674c98d127a643e1fe79fea8537bce547e37bb3 Mon Sep 17 00:00:00 2001 From: Eddie Date: Wed, 11 Dec 2024 16:58:14 -0800 Subject: [PATCH 11/22] Changed Dataset names to green and added icons next to both project and dataset names. Started trying to implement app-wide search. will make another branch for that. --- Caf.Midden.Wasm/Pages/Index.razor | 18 ++++-------- Caf.Midden.Wasm/Pages/Index.razor.cs | 28 +++++++++++++++++++ .../FilteredCatalogMetadataViewer.razor | 10 +++++-- .../Shared/FilteredCatalogProjectViewer.razor | 24 ++++++++++++++-- Caf.Midden.Wasm/wwwroot/css/custom.css | 9 +++++- 5 files changed, 70 insertions(+), 19 deletions(-) diff --git a/Caf.Midden.Wasm/Pages/Index.razor b/Caf.Midden.Wasm/Pages/Index.razor index ccba967..0f701da 100644 --- a/Caf.Midden.Wasm/Pages/Index.razor +++ b/Caf.Midden.Wasm/Pages/Index.razor @@ -1,7 +1,12 @@ @page "/" +@using AntDesign @inject Services.StateContainer State
+ @* *@ @if (State?.AppConfig != null) { @@ -171,19 +176,6 @@
-@code{ - private string DebugMsg { get; set; } - - private async Task AppConfig_StateChanged( - ComponentBase source, - string appConfig) - { - if (source != this) - { - await InvokeAsync(StateHasChanged); - DebugMsg = "StateHasChanged"; - } - } //protected override void OnInitialized() //{ diff --git a/Caf.Midden.Wasm/Pages/Index.razor.cs b/Caf.Midden.Wasm/Pages/Index.razor.cs index c688e6a..8ee5d8f 100644 --- a/Caf.Midden.Wasm/Pages/Index.razor.cs +++ b/Caf.Midden.Wasm/Pages/Index.razor.cs @@ -27,6 +27,11 @@ public partial class Index : IDisposable DateTime CatalogLastUpdate { get; set; } + public string SearchTerm { get; set; } + + public List BaseMetadatas { get; set; } = new List(); + public List FilteredMetadata { get; set; } = new List(); + EmbeddedProperty Property(int span, int offset) => new() { Span = span, Offset = offset }; IChartComponent MetadataPerZone = new Column(); @@ -166,6 +171,27 @@ private void SetSimpleStats() this.TotalContacts = UniqueContacts.Count; } + private void SearchHandler() + { + if (string.IsNullOrWhiteSpace(SearchTerm)) + { + FilteredMetadata = this.BaseMetadatas; + } + else + { + FilteredMetadata = this.BaseMetadatas + .Where(m => + (m.Dataset.Name.ToLower().Contains( + SearchTerm.ToLower())) || + (m.Dataset.Description.ToLower().Contains( + SearchTerm.ToLower())) || + (m.Dataset.Tags.Any(t => t.ToLower().Contains( + SearchTerm.ToLower())))) + .OrderByDescending(m => m.Dataset.LastUpdate) + .ToList(); + } + } + private void CreateDatasetsPerZone() { List objs = new List(); @@ -189,6 +215,8 @@ private void CreateDatasetsPerZone() MetadataPerZone.ChangeData(MetadataPerZoneData); } + + private void CreateProjectsPerStatus() { List objs = new List(); diff --git a/Caf.Midden.Wasm/Shared/FilteredCatalogMetadataViewer.razor b/Caf.Midden.Wasm/Shared/FilteredCatalogMetadataViewer.razor index e816bd8..e081da8 100644 --- a/Caf.Midden.Wasm/Shared/FilteredCatalogMetadataViewer.razor +++ b/Caf.Midden.Wasm/Shared/FilteredCatalogMetadataViewer.razor @@ -29,7 +29,9 @@ - + + + @metadata.Dataset.Name @@ -40,11 +42,12 @@ - + @metadata.Dataset.Zone + @metadata.Dataset.Project @@ -78,4 +81,5 @@ } else { -} \ No newline at end of file +} + diff --git a/Caf.Midden.Wasm/Shared/FilteredCatalogProjectViewer.razor b/Caf.Midden.Wasm/Shared/FilteredCatalogProjectViewer.razor index ab80f46..1bc0520 100644 --- a/Caf.Midden.Wasm/Shared/FilteredCatalogProjectViewer.razor +++ b/Caf.Midden.Wasm/Shared/FilteredCatalogProjectViewer.razor @@ -29,8 +29,8 @@ - - + + @project.Name @if(!string.IsNullOrEmpty(project.ProjectStatus)) @@ -54,4 +54,24 @@ } +} + +@code { + [Parameter] + public string SearchQuery { get; set; } + + // [Parameter] + // public bool ShowHeader { get; set; } = true; + + // [Parameter] + // public bool ShowSearch { get; set; } = true; + + private List FilteredCatalogProjects => State.Catalog.Projects + .Where(p => string.IsNullOrEmpty(SearchQuery) || p.Name.Contains(SearchQuery, StringComparison.OrdinalIgnoreCase)) + .ToList(); + + private void SearchHandler(ChangeEventArgs e) + { + SearchQuery = e.Value.ToString(); + } } \ No newline at end of file diff --git a/Caf.Midden.Wasm/wwwroot/css/custom.css b/Caf.Midden.Wasm/wwwroot/css/custom.css index d427ecc..c52c79c 100644 --- a/Caf.Midden.Wasm/wwwroot/css/custom.css +++ b/Caf.Midden.Wasm/wwwroot/css/custom.css @@ -170,4 +170,11 @@ -webkit-line-clamp: 3; -webkit-box-orient: vertical; max-height: 100px; -} \ No newline at end of file +} + + +.dataset-header-color { + color: green; /* Set the text color to green */ + font-weight: bold; /* Optional: Make the text bold */ + text-decoration: none; /* Optional: Remove underline if applied to links */ +} From 1aec4fc251fdfbfe524115e097a839654487bd1f Mon Sep 17 00:00:00 2001 From: Eddie Date: Fri, 13 Dec 2024 15:03:49 -0800 Subject: [PATCH 12/22] shifted dataset cards to top of home and colored header blue --- Caf.Midden.Wasm/Pages/Index.razor | 23 ++++++------ .../FilteredCatalogMetadataViewer.razor | 11 +++--- .../Shared/FilteredCatalogProjectViewer.razor | 14 +++++--- Caf.Midden.Wasm/wwwroot/css/custom.css | 35 ++++++++++++++++--- 4 files changed, 59 insertions(+), 24 deletions(-) diff --git a/Caf.Midden.Wasm/Pages/Index.razor b/Caf.Midden.Wasm/Pages/Index.razor index 0f701da..0afb5f3 100644 --- a/Caf.Midden.Wasm/Pages/Index.razor +++ b/Caf.Midden.Wasm/Pages/Index.razor @@ -3,11 +3,7 @@ @inject Services.StateContainer State
- @* *@ - + @if (State?.AppConfig != null) { - - Recent Projects <small><a href="catalog/projects"><Icon Type="double-right" Theme="outline" /></a></small> - +
+ +
+ + Recent Datasets <small><a href="catalog/datasets"><Icon Type="double-right" Theme="outline" /></a></small> + + - Recent Datasets <small><a href="catalog/datasets"><Icon Type="double-right" Theme="outline" /></a></small> - + Recent Projects <small><a href="catalog/projects"><Icon Type="double-right" Theme="outline" /></a></small> + diff --git a/Caf.Midden.Wasm/Shared/FilteredCatalogMetadataViewer.razor b/Caf.Midden.Wasm/Shared/FilteredCatalogMetadataViewer.razor index e081da8..2fa8011 100644 --- a/Caf.Midden.Wasm/Shared/FilteredCatalogMetadataViewer.razor +++ b/Caf.Midden.Wasm/Shared/FilteredCatalogMetadataViewer.razor @@ -27,18 +27,21 @@ @foreach (var metadata in FilteredMetadata) { - - - - + + + + + @metadata.Dataset.Name + + diff --git a/Caf.Midden.Wasm/Shared/FilteredCatalogProjectViewer.razor b/Caf.Midden.Wasm/Shared/FilteredCatalogProjectViewer.razor index 1bc0520..9e27a2e 100644 --- a/Caf.Midden.Wasm/Shared/FilteredCatalogProjectViewer.razor +++ b/Caf.Midden.Wasm/Shared/FilteredCatalogProjectViewer.razor @@ -27,17 +27,21 @@ @foreach (var project in ViewModel.FilteredCatalogProjects) { - + @project.Name - @if(!string.IsNullOrEmpty(project.ProjectStatus)) - { - @project.ProjectStatus - } + + + @if (!string.IsNullOrEmpty(project.ProjectStatus)) + { + @project.ProjectStatus + } + + @project.DatasetCount diff --git a/Caf.Midden.Wasm/wwwroot/css/custom.css b/Caf.Midden.Wasm/wwwroot/css/custom.css index c52c79c..9d67410 100644 --- a/Caf.Midden.Wasm/wwwroot/css/custom.css +++ b/Caf.Midden.Wasm/wwwroot/css/custom.css @@ -2,7 +2,8 @@ height: 40px; padding: 5px; line-height: 0px; - background: #40A9FF; + background: #1890ff; + //background: #40A9FF; position: relative; z-index: 10; -webkit-box-shadow: 0px 0px 5px 3px rgba(41,41,41,.25); @@ -173,8 +174,32 @@ } -.dataset-header-color { - color: green; /* Set the text color to green */ - font-weight: bold; /* Optional: Make the text bold */ - text-decoration: none; /* Optional: Remove underline if applied to links */ +.dataset-card .ant-card-head { + background-color: #1890ff; /* Dark gray for dataset heads */ + color: white; /* White text for contrast */ + /*padding: 10px;*/ /* Add spacing */ +} + +.dataset-card .ant-card-head-title { + color: rgb(0,0,0,0.85); /* Ensure title text is white */ + font-weight: bold; /* Make text bold */ +} + +.dataset-card .ant-card-head-extra { + color: rgb(0,0,0,0.85); /* Style extra content if present */ + background-color: darkgray; /* Dark gray for dataset heads */ +} + +.magnifying-button { + background-color: #abb2b9; /* Dark gray background */ + color: black; /* White icon color */ + border: none; /* Remove border */ + border-radius: 5px; /* Rounded corners */ + cursor: pointer; /* Add pointer cursor */ +} + +.magnifying-button:hover { + background-color: #333; /* Slightly darker gray on hover */ + color:white; + font-weight:bold; } From 39c184be985e3031afd84169b38090b2e1ca095b Mon Sep 17 00:00:00 2001 From: bryanrcarlson Date: Fri, 13 Dec 2024 16:58:53 -0800 Subject: [PATCH 13/22] Auto center root node, auto organizes nodes, added zoom controls --- Caf.Midden.Wasm/Shared/MetadataDetails.razor | 3 +- .../Shared/MetadataDetails.razor.cs | 1 + .../MetadataLineageDiagram.razor | 167 ++++++++++++++++++ .../MetadataLineage/MetadataLineageNode.cs | 15 ++ .../MetadataLineageWidget.razor | 48 +++++ .../MetadataLineageWidget.razor.css | 20 +++ .../Shared/MetadataLineageDiagram.razor | 97 ---------- .../MetadataLineageDiagramViewModel.cs | 28 ++- Caf.Midden.Wasm/wwwroot/catalog.json | 1 + 9 files changed, 273 insertions(+), 107 deletions(-) create mode 100644 Caf.Midden.Wasm/Shared/MetadataLineage/MetadataLineageDiagram.razor create mode 100644 Caf.Midden.Wasm/Shared/MetadataLineage/MetadataLineageNode.cs create mode 100644 Caf.Midden.Wasm/Shared/MetadataLineage/MetadataLineageWidget.razor create mode 100644 Caf.Midden.Wasm/Shared/MetadataLineage/MetadataLineageWidget.razor.css delete mode 100644 Caf.Midden.Wasm/Shared/MetadataLineageDiagram.razor diff --git a/Caf.Midden.Wasm/Shared/MetadataDetails.razor b/Caf.Midden.Wasm/Shared/MetadataDetails.razor index c99c0ba..fa7b347 100644 --- a/Caf.Midden.Wasm/Shared/MetadataDetails.razor +++ b/Caf.Midden.Wasm/Shared/MetadataDetails.razor @@ -1,4 +1,5 @@ -@inject Caf.Midden.Wasm.Services.StateContainer State +@using Caf.Midden.Wasm.Shared.MetadataLineage +@inject Caf.Midden.Wasm.Services.StateContainer State @if (this.Metadata != null) { diff --git a/Caf.Midden.Wasm/Shared/MetadataDetails.razor.cs b/Caf.Midden.Wasm/Shared/MetadataDetails.razor.cs index 661a686..75ecb11 100644 --- a/Caf.Midden.Wasm/Shared/MetadataDetails.razor.cs +++ b/Caf.Midden.Wasm/Shared/MetadataDetails.razor.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using AntDesign; using Markdig; +using Caf.Midden.Wasm.Shared.MetadataLineage; namespace Caf.Midden.Wasm.Shared { diff --git a/Caf.Midden.Wasm/Shared/MetadataLineage/MetadataLineageDiagram.razor b/Caf.Midden.Wasm/Shared/MetadataLineage/MetadataLineageDiagram.razor new file mode 100644 index 0000000..0f51a8a --- /dev/null +++ b/Caf.Midden.Wasm/Shared/MetadataLineage/MetadataLineageDiagram.razor @@ -0,0 +1,167 @@ +@using Blazor.Diagrams +@using Blazor.Diagrams.Core.Anchors +@using Blazor.Diagrams.Core.Extensions +@using Blazor.Diagrams.Core.Models +@using Blazor.Diagrams.Core.PathGenerators; +@using Blazor.Diagrams.Core.Routers; +@using Blazor.Diagrams.Options; +@using Blazor.Diagrams.Components; +@using Caf.Midden.Wasm.Services +@using Caf.Midden.Wasm.Shared.ViewModels; + +@inject Caf.Midden.Wasm.Services.StateContainer State + +
+ + + + +
+
+
+ +@code { + [Parameter] + public Dataset dataset { get; set; } + + private MetadataLineageDiagramViewModel viewModel; + private const int COLUMN_WIDTH = 400; + private const int ROW_HEIGHT = 200; + private const double ZOOM_INCREMENT = 0.2; + + private bool _InitialResize = false; + private int _NumberCols = 1; + private int _NumberRows = 1; + private List> _CellTracker = new List>(); // Column> + + public BlazorDiagram Diagram { get; set; } = null!; + + protected override void OnInitialized() + { + viewModel = + new MetadataLineageDiagramViewModel(dataset, State.Catalog); + + var datasetNode = viewModel.GetDatasetNode(); + + Diagram = new BlazorDiagram(); + Diagram.Options.Zoom.Enabled = true; + Diagram.RegisterComponent(); + Diagram.ContainerChanged += OnContainerChanged; + + CreateNodes(datasetNode, 0, 0); + } + + private void ZoomIn() + { + var currentZoom = Diagram.Zoom; + var newZoom = currentZoom + ZOOM_INCREMENT; + if(newZoom > 0) + { + Diagram.SetZoom(newZoom); + } + } + + private void ZoomOut() + { + var currentZoom = Diagram.Zoom; + var newZoom = currentZoom - ZOOM_INCREMENT; + if (newZoom > 0) + { + Diagram.SetZoom(newZoom); + } + } + + protected override void OnAfterRender(bool firstRender) + { + base.OnAfterRender(firstRender); + + if(Diagram.Container != null) + { + //Diagram.ZoomToFit(0); + } + } + + private void OnContainerChanged() + { + if(Diagram.Container != null && _InitialResize == false) + { + Diagram.SetZoom(0.7); + + // Centers base node -- derived from this: https://github.com/Blazor-Diagrams/Blazor.Diagrams/issues/269#issuecomment-1322025484 + int margin = 10; + + var width = COLUMN_WIDTH * Diagram.Zoom; + var scaledMargin = margin * Diagram.Zoom; + var deltaX = (Diagram.Container.Width / 2) - (width / 2) - scaledMargin; + Diagram.UpdatePan(deltaX, 0); + + _InitialResize = true; + } + } + + private void CreateNodes(DatasetNode datasetNode, int column, int row, NodeModel thisNode = null) + { + // Create a new node if one wasn't passed through recursion + if(thisNode == null) + { + thisNode = Diagram.Nodes.Add( + new MetadataLineageNode( + position: new Blazor.Diagrams.Core.Geometry.Point((column * COLUMN_WIDTH), (row * ROW_HEIGHT))) + { + Name = $"{datasetNode.Name}", + Project = $"{datasetNode.Project}", + Zone = $"{datasetNode.Zone}", + Url = $"{datasetNode.Url}" + }); + + // Register this on the cell tracker + _CellTracker.Add(new List() + { + true + }); + } + + var leftPortThisNode = thisNode.AddPort(PortAlignment.Left); + + // If there are parents, then we need to move over a column + if(datasetNode.Parents.Count > 0) + { + _CellTracker.Add(new List()); + column += 1; + } + + foreach (var parent in datasetNode.Parents.OrderByDescending(p => p.Parents.Count).ToList()) + { + var diagramCol = column * -1; + var diagramRow = _CellTracker[column].Count; + + var parentNode = Diagram.Nodes.Add(new MetadataLineageNode(position: new Blazor.Diagrams.Core.Geometry.Point((diagramCol * COLUMN_WIDTH), (diagramRow * ROW_HEIGHT))) + { + Name = $"{parent.Name}", + Project = $"{parent.Project}", + Zone = $"{parent.Zone}", + Url = $"{parent.Url}" + }); + var rightPortParentNode = parentNode.AddPort(PortAlignment.Right); + var parentAnchor = new SinglePortAnchor(rightPortParentNode); + var childAnchor = new SinglePortAnchor(leftPortThisNode); + var parentToChildLink = Diagram.Links.Add(new LinkModel(parentAnchor, childAnchor) + { + PathGenerator = new SmoothPathGenerator(), + Router = new NormalRouter(), + TargetMarker = LinkMarker.Arrow + }); + + // Adds a row to current column + _CellTracker[column].Add(true); + + if(parent.Parents.Count > 0) + { + _CellTracker.Add(new List()); + CreateNodes(parent, column, _CellTracker[column].Count, parentNode); + } + } + } +} diff --git a/Caf.Midden.Wasm/Shared/MetadataLineage/MetadataLineageNode.cs b/Caf.Midden.Wasm/Shared/MetadataLineage/MetadataLineageNode.cs new file mode 100644 index 0000000..e40c95f --- /dev/null +++ b/Caf.Midden.Wasm/Shared/MetadataLineage/MetadataLineageNode.cs @@ -0,0 +1,15 @@ +using Blazor.Diagrams.Core.Models; + +namespace Caf.Midden.Wasm.Shared.MetadataLineage +{ + public class MetadataLineageNode : NodeModel + { + public MetadataLineageNode(Blazor.Diagrams.Core.Geometry.Point? position = null): base(position) { } + + public string Name { get; set; } + public string Project { get; set; } + public string Zone { get; set; } + + public string Url { get; set; } + } +} diff --git a/Caf.Midden.Wasm/Shared/MetadataLineage/MetadataLineageWidget.razor b/Caf.Midden.Wasm/Shared/MetadataLineage/MetadataLineageWidget.razor new file mode 100644 index 0000000..5033860 --- /dev/null +++ b/Caf.Midden.Wasm/Shared/MetadataLineage/MetadataLineageWidget.razor @@ -0,0 +1,48 @@ +@using Blazor.Diagrams.Components.Renderers; +@using Caf.Midden.Wasm.Shared.MetadataLineage; + +
+ @foreach (var port in Node.Ports) + { + // In case you have any ports to show + // IMPORTANT: You are always in charge of rendering ports + + } + + + + @if (!String.IsNullOrEmpty(Node.Url)) + { + + } + + + @if(!String.IsNullOrEmpty(Node.Zone)) + { +

+ + + @Node.Zone + +

+ } + @if(!String.IsNullOrEmpty(Node.Project)) + { +

+ + + @Node.Project + +

+ } + + + +
+
+ +
+ +@code { + [Parameter] public MetadataLineageNode Node { get; set; } = null!; +} diff --git a/Caf.Midden.Wasm/Shared/MetadataLineage/MetadataLineageWidget.razor.css b/Caf.Midden.Wasm/Shared/MetadataLineage/MetadataLineageWidget.razor.css new file mode 100644 index 0000000..dfb9aa9 --- /dev/null +++ b/Caf.Midden.Wasm/Shared/MetadataLineage/MetadataLineageWidget.razor.css @@ -0,0 +1,20 @@ +::deep .diagram-port { + position: absolute; + width: 1px; + height: 1px; + background-color: darkgray; + transform: translate(-50%, -50%); + top: 50%; +} + + ::deep .diagram-port.left { + left: 0; + } + + ::deep .diagram-port.right { + left: 100%; + } + +div .dataset-node { + box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.2), 0 6px 20px 0 rgba(0, 0, 0, 0.19); +} \ No newline at end of file diff --git a/Caf.Midden.Wasm/Shared/MetadataLineageDiagram.razor b/Caf.Midden.Wasm/Shared/MetadataLineageDiagram.razor deleted file mode 100644 index 2b2a0d3..0000000 --- a/Caf.Midden.Wasm/Shared/MetadataLineageDiagram.razor +++ /dev/null @@ -1,97 +0,0 @@ -@using Blazor.Diagrams -@using Blazor.Diagrams.Core.Anchors -@using Blazor.Diagrams.Core.Models -@using Blazor.Diagrams.Core.PathGenerators; -@using Blazor.Diagrams.Core.Routers; -@using Blazor.Diagrams.Options; -@using Blazor.Diagrams.Components; -@using Caf.Midden.Wasm.Services -@using Caf.Midden.Wasm.Shared.ViewModels; - -@inject Caf.Midden.Wasm.Services.StateContainer State - -
- - - -
- -@code { - [Parameter] - public Dataset dataset { get; set; } - - private MetadataLineageDiagramViewModel viewModel; - - - private BlazorDiagram _Diagram { get; set; } = null!; - - protected override void OnInitialized() - { - // TODO: Create a component to style thoe nodes: https://blazor-diagrams.zhaytam.com/documentation/nodes-customization - - viewModel = - new MetadataLineageDiagramViewModel(dataset, State.Catalog); - - var node = viewModel.GetDatasetNode(); - var options = new BlazorDiagramOptions - { - AllowMultiSelection = false, - Zoom = - { - Enabled = true, - }, - Links = - { - DefaultRouter = new NormalRouter(), - DefaultPathGenerator = new SmoothPathGenerator() - } - }; - - _Diagram = new BlazorDiagram(options); - - CreateNodes(node); - - _Diagram.ZoomToFit(); - } - - private void CreateNodes(DatasetNode datasetNode, NodeModel thisNode = null) - { - // Create a new node if one wasn't passed through recursion - if(thisNode == null) - { - thisNode = _Diagram.Nodes.Add( - new NodeModel( - position: new Blazor.Diagrams.Core.Geometry.Point(50, 50)) - { - Title = $"{datasetNode.Name}" - }); - } - - //var leftPortThisNode = thisNode.AddPort(PortAlignment.Left); - - int currentRow = 1; - int rowHeight = 50; - - foreach(var parent in datasetNode.Parents) - { - var parentNode = _Diagram.Nodes.Add(new NodeModel(position: new Blazor.Diagrams.Core.Geometry.Point(-50, (currentRow*rowHeight))) - { - Title = $"{parent.Name}" - }); - //var rightPortParentNode = parentNode.AddPort(PortAlignment.Right); - //var parentAnchor = new SinglePortAnchor(rightPortParentNode); - //var childAnchor = new SinglePortAnchor(leftPortThisNode); - var parentToChildLink = _Diagram.Links.Add(new LinkModel(parentNode, thisNode)); - parentToChildLink.TargetMarker = LinkMarker.Arrow; - - currentRow += 1; - - if(parent.Parents.Count > 0) - { - CreateNodes(parent, parentNode); - } - } - } - - -} diff --git a/Caf.Midden.Wasm/Shared/ViewModels/MetadataLineageDiagramViewModel.cs b/Caf.Midden.Wasm/Shared/ViewModels/MetadataLineageDiagramViewModel.cs index 23397b1..57951de 100644 --- a/Caf.Midden.Wasm/Shared/ViewModels/MetadataLineageDiagramViewModel.cs +++ b/Caf.Midden.Wasm/Shared/ViewModels/MetadataLineageDiagramViewModel.cs @@ -29,12 +29,18 @@ public DatasetNode GetDatasetNode() } private DatasetNode InitializeDatasetNode(Dataset dataset) { - var node = new DatasetNode(dataset.Name, GetRelativeUrlForDataset(dataset)); + var node = new DatasetNode( + dataset.Name, + dataset.Project, + dataset.Zone, + GetRelativeUrlForDataset(dataset)); foreach (var parentDatasetString in dataset.ParentDatasets) { var parentName = ""; var parentUrl = ""; + var parentZone = ""; + var parentProject = ""; if (parentDatasetString.StartsWith(MIDDEN_DATASET_FLAG)) { @@ -66,20 +72,18 @@ private DatasetNode InitializeDatasetNode(Dataset dataset) // Failed to find the dataset in the catalog, so just set name as url parentName = parentUrl; - var parentNode = new DatasetNode(parentName, parentUrl); + var parentNode = new DatasetNode(parentName, parentProject, parentZone, parentUrl); _NumberConnections += 1; node.AddParent(parentNode); } - - - + } else { // It's not a valid url, so set the name to it and don't link anything parentName = potentialUrl; - var parentNode = new DatasetNode(parentName, parentUrl); + var parentNode = new DatasetNode(parentName, parentProject, parentZone, parentUrl); _NumberConnections += 1; node.AddParent(parentNode); } @@ -93,7 +97,7 @@ private DatasetNode InitializeDatasetNode(Dataset dataset) parentUrl = parentDatasetString; } - var parentNode = new DatasetNode(parentName, parentUrl); + var parentNode = new DatasetNode(parentName, parentProject, parentZone, parentUrl); _NumberConnections += 1; node.AddParent(parentNode); } @@ -104,7 +108,7 @@ private DatasetNode InitializeDatasetNode(Dataset dataset) private string GetRelativeUrlForDataset(Dataset dataset) { - var result = $"/{dataset.Zone}/{dataset.Project}/{dataset.Name}"; + var result = $"/catalog/datasets/{dataset.Zone}/{dataset.Project}/{dataset.Name}"; return result; } @@ -141,13 +145,19 @@ public class DatasetNode private List _Parents = new List(); //private List _Children = new List(); + + public string Zone { get; set; } + public string Project { get; set; } public string Name { get; set; } + public string Url { get; set; } - public DatasetNode(string name, string url) + public DatasetNode(string name, string project, string zone, string url) { this.Name = name; this.Url = url; + this.Zone = zone; + this.Project = project; } public IReadOnlyCollection Parents diff --git a/Caf.Midden.Wasm/wwwroot/catalog.json b/Caf.Midden.Wasm/wwwroot/catalog.json index 5ec7d81..02d6ad2 100644 --- a/Caf.Midden.Wasm/wwwroot/catalog.json +++ b/Caf.Midden.Wasm/wwwroot/catalog.json @@ -3670,6 +3670,7 @@ "parentDatasets": [ "https://github.com/cafltar/Midden_AzureFunctionRunCollator/blob/main/README.md", "Armendariz, Gerardo; Coffin, Alisa W.; Archer, David; Arthur, Dan; Bean, Alycia; Browning, Dawn; Carlson, Bryan; Clark, Pat; Flynn, Colton; Goslee, Sarah; Hall, Veronica; Holifield Collins, Chandra; Hsieh, Hsun-Yi; Johnson, Jane M. F.; Kaplan, Nicole; Kautz, Mark; Kettler, Tim; King, Kevin; Moglen, Glenn; Schmer, Marty; Sclater, Vivienne; Spiegal, Sheri; Stark, Patrick; Stinner, Jedediah; Sudduth, Ken; Teet, Stephen; Wagner, Steve; Yasarer, Lindsey (2021). The Long-Term Agroecosystem Research (LTAR) Network Standard GIS Data Layers, 2020 version. Ag Data Commons. https://doi.org/10.15482/USDA.ADC/1521161", + "[Midden]https://localhost:5001/catalog/datasets/Work/TestProject/WorkingDataFromTwoRaw", "[Midden]https://localhost:5001/catalog/datasets/Work/TestProject/WorkingDataFromTwoRaw" ] } From 6dd9715c808cfb3b92389033516db68f96e8dfbd Mon Sep 17 00:00:00 2001 From: bryanrcarlson Date: Mon, 16 Dec 2024 15:52:53 -0800 Subject: [PATCH 14/22] Widget links open in new tab, shifted default canvas over to the right, some code cleanup --- Caf.Midden.Wasm/Shared/MetadataDetails.razor | 16 ---------------- .../MetadataLineage/MetadataLineageDiagram.razor | 15 +++------------ .../MetadataLineage/MetadataLineageNode.cs | 1 - .../MetadataLineage/MetadataLineageWidget.razor | 6 ++---- .../MetadataLineageDiagramViewModel.cs | 1 - 5 files changed, 5 insertions(+), 34 deletions(-) diff --git a/Caf.Midden.Wasm/Shared/MetadataDetails.razor b/Caf.Midden.Wasm/Shared/MetadataDetails.razor index fa7b347..16ad747 100644 --- a/Caf.Midden.Wasm/Shared/MetadataDetails.razor +++ b/Caf.Midden.Wasm/Shared/MetadataDetails.razor @@ -58,22 +58,6 @@
- - - -
- Parent Datasets -
- - - - - -
-
-
diff --git a/Caf.Midden.Wasm/Shared/MetadataLineage/MetadataLineageDiagram.razor b/Caf.Midden.Wasm/Shared/MetadataLineage/MetadataLineageDiagram.razor index 0f51a8a..0df3369 100644 --- a/Caf.Midden.Wasm/Shared/MetadataLineage/MetadataLineageDiagram.razor +++ b/Caf.Midden.Wasm/Shared/MetadataLineage/MetadataLineageDiagram.razor @@ -73,16 +73,6 @@ } } - protected override void OnAfterRender(bool firstRender) - { - base.OnAfterRender(firstRender); - - if(Diagram.Container != null) - { - //Diagram.ZoomToFit(0); - } - } - private void OnContainerChanged() { if(Diagram.Container != null && _InitialResize == false) @@ -90,9 +80,10 @@ Diagram.SetZoom(0.7); // Centers base node -- derived from this: https://github.com/Blazor-Diagrams/Blazor.Diagrams/issues/269#issuecomment-1322025484 - int margin = 10; + int margin = 0; - var width = COLUMN_WIDTH * Diagram.Zoom; + //var width = COLUMN_WIDTH * Diagram.Zoom; + var width = Diagram.Zoom; var scaledMargin = margin * Diagram.Zoom; var deltaX = (Diagram.Container.Width / 2) - (width / 2) - scaledMargin; Diagram.UpdatePan(deltaX, 0); diff --git a/Caf.Midden.Wasm/Shared/MetadataLineage/MetadataLineageNode.cs b/Caf.Midden.Wasm/Shared/MetadataLineage/MetadataLineageNode.cs index e40c95f..6b75620 100644 --- a/Caf.Midden.Wasm/Shared/MetadataLineage/MetadataLineageNode.cs +++ b/Caf.Midden.Wasm/Shared/MetadataLineage/MetadataLineageNode.cs @@ -9,7 +9,6 @@ public MetadataLineageNode(Blazor.Diagrams.Core.Geometry.Point? position = null) public string Name { get; set; } public string Project { get; set; } public string Zone { get; set; } - public string Url { get; set; } } } diff --git a/Caf.Midden.Wasm/Shared/MetadataLineage/MetadataLineageWidget.razor b/Caf.Midden.Wasm/Shared/MetadataLineage/MetadataLineageWidget.razor index 5033860..444969c 100644 --- a/Caf.Midden.Wasm/Shared/MetadataLineage/MetadataLineageWidget.razor +++ b/Caf.Midden.Wasm/Shared/MetadataLineage/MetadataLineageWidget.razor @@ -21,7 +21,7 @@ {

- + @Node.Zone

@@ -30,13 +30,11 @@ {

- + @Node.Project

} - -
diff --git a/Caf.Midden.Wasm/Shared/ViewModels/MetadataLineageDiagramViewModel.cs b/Caf.Midden.Wasm/Shared/ViewModels/MetadataLineageDiagramViewModel.cs index 57951de..73641de 100644 --- a/Caf.Midden.Wasm/Shared/ViewModels/MetadataLineageDiagramViewModel.cs +++ b/Caf.Midden.Wasm/Shared/ViewModels/MetadataLineageDiagramViewModel.cs @@ -149,7 +149,6 @@ public class DatasetNode public string Zone { get; set; } public string Project { get; set; } public string Name { get; set; } - public string Url { get; set; } public DatasetNode(string name, string project, string zone, string url) From a9632b2ab67a927f43880d980f405976ffd20dcd Mon Sep 17 00:00:00 2001 From: bryanrcarlson Date: Tue, 17 Dec 2024 10:36:15 -0800 Subject: [PATCH 15/22] Added checks for nulls to prevent exception, bumped beta version --- Caf.Midden.Wasm/Caf.Midden.Wasm.csproj | 2 +- .../Shared/CatalogVariableViewer.razor.cs | 15 +++++---------- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj b/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj index bfbb592..1845c22 100644 --- a/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj +++ b/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj @@ -3,7 +3,7 @@ net9.0 service-worker-assets.js 0.4.0 - 0.4.0-dev.2 + 0.4.0-dev.3 diff --git a/Caf.Midden.Wasm/Shared/CatalogVariableViewer.razor.cs b/Caf.Midden.Wasm/Shared/CatalogVariableViewer.razor.cs index 5406f83..ea61930 100644 --- a/Caf.Midden.Wasm/Shared/CatalogVariableViewer.razor.cs +++ b/Caf.Midden.Wasm/Shared/CatalogVariableViewer.razor.cs @@ -154,16 +154,11 @@ private void SearchHandler() { ViewModel.FilteredCatalogVariables = ViewModel.CatalogVariables .Where(c => - (c.DatasetName.ToLower().Contains( - ViewModel.SearchTerm.ToLower())) || - (c.Name.ToLower().Contains( - ViewModel.SearchTerm.ToLower())) || - (c.Description.ToLower().Contains( - ViewModel.SearchTerm.ToLower())) || - (c.Units.ToLower().Contains( - ViewModel.SearchTerm.ToLower())) || - (c.Tags.Any(t => t.ToLower().Contains( - ViewModel.SearchTerm.ToLower())))) + (c.DatasetName != null && c.DatasetName.ToLower().Contains(ViewModel.SearchTerm.ToLower())) || + (c.Name != null && c.Name.ToLower().Contains(ViewModel.SearchTerm.ToLower())) || + (c.Description != null && c.Description.ToLower().Contains(ViewModel.SearchTerm.ToLower())) || + (c.Units != null && c.Units.ToLower().Contains(ViewModel.SearchTerm.ToLower())) || + (c.Tags != null && c.Tags.Any(t => t != null && t.ToLower().Contains(ViewModel.SearchTerm.ToLower())))) .ToList(); } } From ff1b6918c1c137ef060d70616a4dba733b254cd1 Mon Sep 17 00:00:00 2001 From: Eddie Date: Fri, 20 Dec 2024 11:22:29 -0800 Subject: [PATCH 16/22] cleaned up code to only be card edits --- Caf.Midden.Wasm/Pages/Index.razor | 11 +++---- Caf.Midden.Wasm/Pages/Index.razor.cs | 36 +++++++++------------ Caf.Midden.Wasm/Shared/MetadataEditor.razor | 2 ++ 3 files changed, 21 insertions(+), 28 deletions(-) diff --git a/Caf.Midden.Wasm/Pages/Index.razor b/Caf.Midden.Wasm/Pages/Index.razor index 0afb5f3..74b3470 100644 --- a/Caf.Midden.Wasm/Pages/Index.razor +++ b/Caf.Midden.Wasm/Pages/Index.razor @@ -76,12 +76,6 @@ -
- -
Recent Datasets <small><a href="catalog/datasets"><Icon Type="double-right" Theme="outline" /></a></small> @@ -191,4 +185,7 @@ // => await AppConfig_StateChanged(source, property); //} -} \ No newline at end of file +} + + + diff --git a/Caf.Midden.Wasm/Pages/Index.razor.cs b/Caf.Midden.Wasm/Pages/Index.razor.cs index 8ee5d8f..f5420ed 100644 --- a/Caf.Midden.Wasm/Pages/Index.razor.cs +++ b/Caf.Midden.Wasm/Pages/Index.razor.cs @@ -1,6 +1,7 @@ using AntDesign; using AntDesign.Charts; using Caf.Midden.Core.Models.v0_2; +using Caf.Midden.Wasm.Shared.ViewModels; using Microsoft.AspNetCore.Components; using System; using System.Collections.Generic; @@ -27,7 +28,9 @@ public partial class Index : IDisposable DateTime CatalogLastUpdate { get; set; } - public string SearchTerm { get; set; } + //public string SearchTerm { get; set; } + + private List Suggestions { get; set; } = new(); public List BaseMetadatas { get; set; } = new List(); public List FilteredMetadata { get; set; } = new List(); @@ -36,6 +39,17 @@ public partial class Index : IDisposable IChartComponent MetadataPerZone = new Column(); public object[] MetadataPerZoneData { get; set; } + + public List FilteredSuggestions { get; set; } = new(); + + public List BaseDatasets { get; set; } = new(); // All datasets + public List BaseProjects { get; set; } = new(); // All projects + public List BaseVariables { get; set; } = new(); // All variables + + public List FilteredCatalogProjects { get; set; } = new(); + public List FilteredDatasets { get; set; } = new(); + public List FilteredCatalogVariables { get; set; } = new(); + ColumnConfig MetadataPerZoneConfig = new ColumnConfig { Title = new AntDesign.Charts.Title @@ -171,26 +185,6 @@ private void SetSimpleStats() this.TotalContacts = UniqueContacts.Count; } - private void SearchHandler() - { - if (string.IsNullOrWhiteSpace(SearchTerm)) - { - FilteredMetadata = this.BaseMetadatas; - } - else - { - FilteredMetadata = this.BaseMetadatas - .Where(m => - (m.Dataset.Name.ToLower().Contains( - SearchTerm.ToLower())) || - (m.Dataset.Description.ToLower().Contains( - SearchTerm.ToLower())) || - (m.Dataset.Tags.Any(t => t.ToLower().Contains( - SearchTerm.ToLower())))) - .OrderByDescending(m => m.Dataset.LastUpdate) - .ToList(); - } - } private void CreateDatasetsPerZone() { diff --git a/Caf.Midden.Wasm/Shared/MetadataEditor.razor b/Caf.Midden.Wasm/Shared/MetadataEditor.razor index a0a05dc..cd60666 100644 --- a/Caf.Midden.Wasm/Shared/MetadataEditor.razor +++ b/Caf.Midden.Wasm/Shared/MetadataEditor.razor @@ -179,6 +179,8 @@ ScrollX="1400" PageSize="50"> + + @if(VariableQuickEditRef == variable) From ba13c6cb5322faa845489e1dab4b48850a5bff3b Mon Sep 17 00:00:00 2001 From: Eddie Date: Fri, 20 Dec 2024 11:28:13 -0800 Subject: [PATCH 17/22] more cleanup --- Caf.Midden.Wasm/Pages/Index.razor.cs | 17 ---------------- .../Shared/FilteredCatalogProjectViewer.razor | 20 ------------------- Caf.Midden.Wasm/Shared/MetadataEditor.razor | 2 +- 3 files changed, 1 insertion(+), 38 deletions(-) diff --git a/Caf.Midden.Wasm/Pages/Index.razor.cs b/Caf.Midden.Wasm/Pages/Index.razor.cs index f5420ed..f6564d1 100644 --- a/Caf.Midden.Wasm/Pages/Index.razor.cs +++ b/Caf.Midden.Wasm/Pages/Index.razor.cs @@ -1,7 +1,6 @@ using AntDesign; using AntDesign.Charts; using Caf.Midden.Core.Models.v0_2; -using Caf.Midden.Wasm.Shared.ViewModels; using Microsoft.AspNetCore.Components; using System; using System.Collections.Generic; @@ -28,27 +27,11 @@ public partial class Index : IDisposable DateTime CatalogLastUpdate { get; set; } - //public string SearchTerm { get; set; } - - private List Suggestions { get; set; } = new(); - - public List BaseMetadatas { get; set; } = new List(); - public List FilteredMetadata { get; set; } = new List(); - EmbeddedProperty Property(int span, int offset) => new() { Span = span, Offset = offset }; IChartComponent MetadataPerZone = new Column(); public object[] MetadataPerZoneData { get; set; } - public List FilteredSuggestions { get; set; } = new(); - - public List BaseDatasets { get; set; } = new(); // All datasets - public List BaseProjects { get; set; } = new(); // All projects - public List BaseVariables { get; set; } = new(); // All variables - - public List FilteredCatalogProjects { get; set; } = new(); - public List FilteredDatasets { get; set; } = new(); - public List FilteredCatalogVariables { get; set; } = new(); ColumnConfig MetadataPerZoneConfig = new ColumnConfig { diff --git a/Caf.Midden.Wasm/Shared/FilteredCatalogProjectViewer.razor b/Caf.Midden.Wasm/Shared/FilteredCatalogProjectViewer.razor index 9e27a2e..57c12a0 100644 --- a/Caf.Midden.Wasm/Shared/FilteredCatalogProjectViewer.razor +++ b/Caf.Midden.Wasm/Shared/FilteredCatalogProjectViewer.razor @@ -59,23 +59,3 @@ }
} - -@code { - [Parameter] - public string SearchQuery { get; set; } - - // [Parameter] - // public bool ShowHeader { get; set; } = true; - - // [Parameter] - // public bool ShowSearch { get; set; } = true; - - private List FilteredCatalogProjects => State.Catalog.Projects - .Where(p => string.IsNullOrEmpty(SearchQuery) || p.Name.Contains(SearchQuery, StringComparison.OrdinalIgnoreCase)) - .ToList(); - - private void SearchHandler(ChangeEventArgs e) - { - SearchQuery = e.Value.ToString(); - } -} \ No newline at end of file diff --git a/Caf.Midden.Wasm/Shared/MetadataEditor.razor b/Caf.Midden.Wasm/Shared/MetadataEditor.razor index cd60666..f044eba 100644 --- a/Caf.Midden.Wasm/Shared/MetadataEditor.razor +++ b/Caf.Midden.Wasm/Shared/MetadataEditor.razor @@ -180,7 +180,7 @@ PageSize="50"> - + @if(VariableQuickEditRef == variable) From b1b9244a8665c29fe73fc3714f31a7758c39cea5 Mon Sep 17 00:00:00 2001 From: Eddie Date: Fri, 20 Dec 2024 11:31:28 -0800 Subject: [PATCH 18/22] even more cleanup --- Caf.Midden.Wasm/Pages/Index.razor | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/Caf.Midden.Wasm/Pages/Index.razor b/Caf.Midden.Wasm/Pages/Index.razor index 74b3470..5e1a3ac 100644 --- a/Caf.Midden.Wasm/Pages/Index.razor +++ b/Caf.Midden.Wasm/Pages/Index.razor @@ -172,6 +172,20 @@
+@code { + private string DebugMsg { get; set; } + + private async Task AppConfig_StateChanged( + ComponentBase source, + string appConfig) + { + if (source != this) + { + await InvokeAsync(StateHasChanged); + DebugMsg = "StateHasChanged"; + } + } + //protected override void OnInitialized() From aa3f67bdfdf8c503a2911ff1204872e4e525389e Mon Sep 17 00:00:00 2001 From: Eddie Date: Tue, 21 Jan 2025 11:32:32 -0800 Subject: [PATCH 19/22] added a csv download button to datasets --- Caf.Midden.Wasm/Pages/Index.razor | 7 +- Caf.Midden.Wasm/Shared/MetadataDetails.razor | 7 ++ .../Shared/MetadataDetails.razor.cs | 70 +++++++++++++++++++ Caf.Midden.Wasm/wwwroot/index.html | 42 +++++++++++ 4 files changed, 123 insertions(+), 3 deletions(-) diff --git a/Caf.Midden.Wasm/Pages/Index.razor b/Caf.Midden.Wasm/Pages/Index.razor index ccba967..8cf2776 100644 --- a/Caf.Midden.Wasm/Pages/Index.razor +++ b/Caf.Midden.Wasm/Pages/Index.razor @@ -75,9 +75,10 @@ - - Recent Projects <small><a href="catalog/projects"><Icon Type="double-right" Theme="outline" /></a></small> - + + Recent Datasets <small><a href="catalog/datasets"><Icon Type="double-right" Theme="outline" /></a></small> + + diff --git a/Caf.Midden.Wasm/Shared/MetadataDetails.razor b/Caf.Midden.Wasm/Shared/MetadataDetails.razor index 95fb791..77e88f4 100644 --- a/Caf.Midden.Wasm/Shared/MetadataDetails.razor +++ b/Caf.Midden.Wasm/Shared/MetadataDetails.razor @@ -112,7 +112,14 @@ Variables + + + + Download + + + @if (Metadata.Dataset.Variables?.Count > 0) { diff --git a/Caf.Midden.Wasm/Shared/MetadataDetails.razor.cs b/Caf.Midden.Wasm/Shared/MetadataDetails.razor.cs index 661a686..9d5e582 100644 --- a/Caf.Midden.Wasm/Shared/MetadataDetails.razor.cs +++ b/Caf.Midden.Wasm/Shared/MetadataDetails.razor.cs @@ -6,6 +6,8 @@ using System.Threading.Tasks; using AntDesign; using Markdig; +using Microsoft.JSInterop; +using System.Text.Json; namespace Caf.Midden.Wasm.Shared { @@ -14,6 +16,9 @@ public partial class MetadataDetails : ComponentBase [Parameter] public Metadata Metadata { get; set; } + [Inject] + private IJSRuntime JSRuntime { get; set; } // Inject the IJSRuntime interface + public bool VarsHaveMethods { get; set; } public bool VarsHaveQCApplied { get; set; } @@ -113,5 +118,70 @@ private void SetFilters(Configuration appConfig) } this.FilterVariableType = variableTypes.ToArray(); } + + private async Task DownloadVariables() + { + if (Metadata?.Dataset?.Variables == null || string.IsNullOrEmpty(Metadata.Dataset.Name)) + { + Console.WriteLine("No variables found to export or dataset name is missing."); + return; + } + + string datasetName = Metadata.Dataset.Name.Replace(" ", "_"); // Replace spaces with underscores + string filename = $"{datasetName}_metadata.csv"; + + var csvData = ConvertToCSV(Metadata.Dataset.Variables); + Console.WriteLine($"Downloading file: {filename}"); + + await JSRuntime.InvokeVoidAsync("downloadCSV", filename, csvData); + } + + + + private string ConvertToCSV(IEnumerable data) + { + if (!data.Any()) return string.Empty; + + var properties = typeof(T).GetProperties(); + var header = string.Join(",", properties.Select(p => $"\"{p.Name}\"")); // Ensure headers are enclosed in quotes + + var rows = data.Select(row => + string.Join(",", properties.Select(p => + { + var value = p.GetValue(row); + if (value == null) return "\"\""; // Handle null values + + if (value is IEnumerable collection) + { + // Convert lists to a single string, replacing "|" with ";" + string listAsString = string.Join("; ", collection.Select(v => v.ToString() + .Replace("\n", " ") // Remove newlines + .Replace("\r", " ") // Remove carriage returns + .Replace("\"", "\"\""))); // Escape existing double quotes + + return $"\"{listAsString}\""; // Enclose in double quotes + } + + var strValue = value.ToString().Trim() + .Replace("\r\n", " ") // Remove Windows-style newlines + .Replace("\n", " ") // Remove Unix-style newlines + .Replace("\r", " ") // Remove Mac-style newlines + .Replace(" ", " ") // Remove large spaces + .Replace("\"", "\"\""); // Escape double quotes + + return $"\"{strValue}\""; // Enclose all values in double quotes + })) + ); + + return $"{header}\n{string.Join("\n", rows)}"; + } + + + + + + + + } } diff --git a/Caf.Midden.Wasm/wwwroot/index.html b/Caf.Midden.Wasm/wwwroot/index.html index 999ca97..9d33799 100644 --- a/Caf.Midden.Wasm/wwwroot/index.html +++ b/Caf.Midden.Wasm/wwwroot/index.html @@ -65,6 +65,48 @@

Midden: Research Data Catalog

document.body.removeChild(link); } } + + window.downloadCSV = (filename, content) => { + console.log("JavaScript function downloadCSV called!"); + + if (!content) { + console.error("No content provided for CSV download."); + return; + } + + console.log("Content preview:", content.substring(0, 200) + "..."); + + try { + // Encode content as UTF-8 with BOM to fix character encoding issues + const BOM = "\uFEFF"; // Byte Order Mark (UTF-8) + const blob = new Blob([BOM + content], { type: 'text/csv;charset=utf-8;' }); + const url = URL.createObjectURL(blob); + + // Create a hidden element for download + const link = document.createElement("a"); + link.setAttribute("href", url); + link.setAttribute("download", filename); + link.style.visibility = "hidden"; + + console.log("Appending download link to document..."); + document.body.appendChild(link); + + // Trigger the download + console.log("Triggering download..."); + link.click(); + + // Cleanup + document.body.removeChild(link); + URL.revokeObjectURL(url); + console.log("Download should now be triggered!"); + } catch (error) { + console.error("Error during CSV download:", error); + } + }; + + + + From a50669995157fa9f6a22c29c1b1890371a4844de Mon Sep 17 00:00:00 2001 From: Eddie Date: Thu, 30 Jan 2025 11:31:00 -0800 Subject: [PATCH 20/22] moved catalogloader back to line 6 and removed @using antdesign --- Caf.Midden.Wasm/Pages/Index.razor | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Caf.Midden.Wasm/Pages/Index.razor b/Caf.Midden.Wasm/Pages/Index.razor index 5e1a3ac..63ae089 100644 --- a/Caf.Midden.Wasm/Pages/Index.razor +++ b/Caf.Midden.Wasm/Pages/Index.razor @@ -1,9 +1,9 @@ @page "/" -@using AntDesign + @inject Services.StateContainer State
- + @if (State?.AppConfig != null) { - + Recent Datasets <small><a href="catalog/datasets"><Icon Type="double-right" Theme="outline" /></a></small> From 54ea760f6e3bbfc5179e14a64c5d1cb2f12abba6 Mon Sep 17 00:00:00 2001 From: bryanrcarlson Date: Thu, 30 Jan 2025 14:19:43 -0800 Subject: [PATCH 21/22] Update Caf.Midden.Wasm.csproj Bumped version --- Caf.Midden.Wasm/Caf.Midden.Wasm.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj b/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj index 1845c22..b9fc79e 100644 --- a/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj +++ b/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj @@ -3,7 +3,7 @@ net9.0 service-worker-assets.js 0.4.0 - 0.4.0-dev.3 + 0.4.0-dev.4 @@ -62,4 +62,4 @@ PreserveNewest - \ No newline at end of file + From cd93931a1f748433e13f50f0ee2f5f1d55ee78cb Mon Sep 17 00:00:00 2001 From: bryanrcarlson Date: Wed, 5 Feb 2025 16:49:11 -0800 Subject: [PATCH 22/22] Bumped version, softened dataset card color and added border --- Caf.Midden.Wasm/Caf.Midden.Wasm.csproj | 2 +- Caf.Midden.Wasm/wwwroot/css/custom.css | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj b/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj index b9fc79e..5a1ba67 100644 --- a/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj +++ b/Caf.Midden.Wasm/Caf.Midden.Wasm.csproj @@ -3,7 +3,7 @@ net9.0 service-worker-assets.js 0.4.0 - 0.4.0-dev.4 + 0.4.0 diff --git a/Caf.Midden.Wasm/wwwroot/css/custom.css b/Caf.Midden.Wasm/wwwroot/css/custom.css index 9d67410..d01a6bb 100644 --- a/Caf.Midden.Wasm/wwwroot/css/custom.css +++ b/Caf.Midden.Wasm/wwwroot/css/custom.css @@ -173,16 +173,19 @@ max-height: 100px; } +.dataset-card.ant-card-bordered { + border: 1px solid #44a5ff; +} .dataset-card .ant-card-head { - background-color: #1890ff; /* Dark gray for dataset heads */ + background-color: #44a5ff; /* Dark gray for dataset heads */ color: white; /* White text for contrast */ /*padding: 10px;*/ /* Add spacing */ } .dataset-card .ant-card-head-title { color: rgb(0,0,0,0.85); /* Ensure title text is white */ - font-weight: bold; /* Make text bold */ + /*font-weight: bold; Make text bold */ } .dataset-card .ant-card-head-extra {