diff --git a/SgfDevs/Dev/PresentationPresenterDisplayService.cs b/SgfDevs/Dev/PresentationPresenterDisplayService.cs new file mode 100644 index 0000000..85237c5 --- /dev/null +++ b/SgfDevs/Dev/PresentationPresenterDisplayService.cs @@ -0,0 +1,66 @@ +#nullable enable +using System.Collections.Generic; +using System.Linq; +using Umbraco.Cms.Web.Common.PublishedModels; +using Umbraco.Extensions; + +namespace SgfDevs.Dev; + +public class PresentationPresenterDisplayService +{ + private const string FallbackImage = "/images/pipey.jpg"; + + private readonly MemberConverter _memberConverter; + private readonly MemberTagDisplayService _memberTagDisplayService; + + public PresentationPresenterDisplayService( + MemberConverter memberConverter, + MemberTagDisplayService memberTagDisplayService) + { + _memberConverter = memberConverter; + _memberTagDisplayService = memberTagDisplayService; + } + + public IReadOnlyList GetPresenters(Presentation presentation, int imageWidth) + { + var presenters = new List(); + + if (presentation.Presenters == null) + { + return presenters; + } + + foreach (var block in presentation.Presenters) + { + switch (block.Content) + { + case PresenterPicker presenterPicker when presenterPicker.Member != null: + { + var member = _memberConverter.FromContent(presenterPicker.Member); + var memberUsername = member.Username?.ToLowerInvariant() ?? string.Empty; + presenters.Add(new PresentationPresenterDisplay( + member.Name, + member.ProfileImage?.GetCropUrl(width: imageWidth) ?? FallbackImage, + $"/member/{memberUsername}", + _memberTagDisplayService.GetDisplayMemberTags(member).ToList())); + break; + } + case NonMemberPresenter nonMemberPresenter: + presenters.Add(new PresentationPresenterDisplay( + nonMemberPresenter.PresenterName ?? "Presenter", + nonMemberPresenter.ProfileImage?.GetCropUrl(width: imageWidth) ?? FallbackImage, + null, + [])); + break; + } + } + + return presenters; + } +} + +public record PresentationPresenterDisplay( + string Name, + string ImageUrl, + string? ProfileUrl, + IReadOnlyList Tags); diff --git a/SgfDevs/Program.cs b/SgfDevs/Program.cs index 4cd7c71..410bb9d 100644 --- a/SgfDevs/Program.cs +++ b/SgfDevs/Program.cs @@ -44,6 +44,7 @@ builder.Services.AddHttpClient(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); diff --git a/SgfDevs/Views/Group.cshtml b/SgfDevs/Views/Group.cshtml index 3ce4aad..94a85de 100644 --- a/SgfDevs/Views/Group.cshtml +++ b/SgfDevs/Views/Group.cshtml @@ -4,6 +4,7 @@ @using ContentModels = Umbraco.Cms.Web.Common.PublishedModels; @inject MemberConverter _memberConverter; @inject MemberTagDisplayService _memberTagDisplayService; +@inject PresentationPresenterDisplayService _presentationPresenterDisplayService; @{ var upcomingPresentations = Umbraco.ContentAtRoot().First().Descendants().Where(p => p.Group.Id == Model.Id); var leaders = (Model.Leaders ?? []).ToArray(); @@ -179,21 +180,19 @@ @foreach (Presentation presentation in upcomingPresentations) { var parentEvent = presentation.Parent(); - var presenterContent = presentation.Presenter; + var presenters = _presentationPresenterDisplayService.GetPresenters(presentation, 960); + var primaryPresenter = presenters.FirstOrDefault(); - if (presenterContent == null) + if (primaryPresenter == null) { continue; } - var presenter = _memberConverter.FromContent(presenterContent); - var presenterMemberTags = _memberTagDisplayService.GetDisplayMemberTags(presenter); - var presenterImage = presenter.ProfileImage?.GetCropUrl(width: 960) ?? "/images/pipey.jpg";
- @presenter.Name + @primaryPresenter.Name
- @foreach (var tagName in presenterMemberTags) + @foreach (var tagName in primaryPresenter.Tags) {
@tagName
} @@ -202,7 +201,10 @@
@presentation.Name
-
@presenter.Name
+ @foreach (var presenter in presenters) + { +
@presenter.Name
+ }
@parentEvent.Name
diff --git a/SgfDevs/Views/Home.cshtml b/SgfDevs/Views/Home.cshtml index 04f6ab4..ca43a97 100644 --- a/SgfDevs/Views/Home.cshtml +++ b/SgfDevs/Views/Home.cshtml @@ -9,6 +9,7 @@ @inject UmbracoHelper _helper; @inject MemberConverter _memberConverter; @inject MemberTagDisplayService _memberTagDisplayService; +@inject PresentationPresenterDisplayService _presentationPresenterDisplayService; @{ Layout = "_Layout"; @@ -54,29 +55,27 @@
    - @foreach (var presentation in presentations) - { - var group = presentation.Group; - - var presenter = _memberConverter.FromContent(presentation.Presenter); - -
  • -
    - - @presenter.Name - - @if (presentation.OtherPresenters != null) - { - foreach (var publishedContent in presentation.OtherPresenters) - { - var otherPresenter = _memberConverter.FromContent(publishedContent); - var image = otherPresenter.ProfileImage == null ? "/images/pipey.jpg" : otherPresenter.ProfileImage.GetCropUrl(width: 500); - - @presenter.Name - - } - } -
    + @foreach (var presentation in presentations) + { + var group = presentation.Group; + var presenters = _presentationPresenterDisplayService.GetPresenters(presentation, 500); + +
  • +
    + @foreach (var presenter in presenters) + { + if (!string.IsNullOrWhiteSpace(presenter.ProfileUrl)) + { + + @presenter.Name + + } + else + { + @presenter.Name + } + } +
    @if (presentation.HasValue("MeetupUrl")) { @@ -87,20 +86,21 @@

    @presentation.Name

    } -
    -
    Presented By
    -
    @presenter.Name
    - - @if (presentation.OtherPresenters != null) - { - @foreach (var publishedContent in presentation.OtherPresenters) - { - var otherPresenter = _memberConverter.FromContent(publishedContent); -
    @otherPresenter.Name
    - } - } - -
    +
    +
    Presented By
    + @foreach (var presenter in presenters) + { + if (!string.IsNullOrWhiteSpace(presenter.ProfileUrl)) + { +
    @presenter.Name
    + } + else + { +
    @presenter.Name
    + } + } + +
    @if (group.Name.ToLower() != "springfield devs") { diff --git a/SgfDevs/uSync/v17/Content/.net-and-why-you-should-care.config b/SgfDevs/uSync/v17/Content/.net-and-why-you-should-care.config index a06653b..01757cf 100644 --- a/SgfDevs/uSync/v17/Content/.net-and-why-you-should-care.config +++ b/SgfDevs/uSync/v17/Content/.net-and-why-you-should-care.config @@ -25,12 +25,43 @@ - - - - - - + + + diff --git a/SgfDevs/uSync/v17/Content/.net-maui-all-kinds-of-questions-some-of-the-answers.config b/SgfDevs/uSync/v17/Content/.net-maui-all-kinds-of-questions-some-of-the-answers.config index ace6962..e378743 100644 --- a/SgfDevs/uSync/v17/Content/.net-maui-all-kinds-of-questions-some-of-the-answers.config +++ b/SgfDevs/uSync/v17/Content/.net-maui-all-kinds-of-questions-some-of-the-answers.config @@ -37,12 +37,43 @@ View the stream on Twitch at https://www.twitch.tv/sgfdevs]]> - - - - - - + + + diff --git a/SgfDevs/uSync/v17/Content/a-beginners-guide-to-monitoring-prometheus-and-grafana.config b/SgfDevs/uSync/v17/Content/a-beginners-guide-to-monitoring-prometheus-and-grafana.config index c99f984..d3dbf4b 100644 --- a/SgfDevs/uSync/v17/Content/a-beginners-guide-to-monitoring-prometheus-and-grafana.config +++ b/SgfDevs/uSync/v17/Content/a-beginners-guide-to-monitoring-prometheus-and-grafana.config @@ -29,12 +29,43 @@ These topics are important to me as I have seen their power first hand as a soft - - - - - - + + + diff --git a/SgfDevs/uSync/v17/Content/a-pragmatic-guide-to-adopting-serverless-computing.config b/SgfDevs/uSync/v17/Content/a-pragmatic-guide-to-adopting-serverless-computing.config index 7c944c4..517d7ac 100644 --- a/SgfDevs/uSync/v17/Content/a-pragmatic-guide-to-adopting-serverless-computing.config +++ b/SgfDevs/uSync/v17/Content/a-pragmatic-guide-to-adopting-serverless-computing.config @@ -25,12 +25,43 @@ - - - - - - + + + diff --git a/SgfDevs/uSync/v17/Content/a-pragmatic-guide-to-adopting-serverless-computing_yujb1m0t.config b/SgfDevs/uSync/v17/Content/a-pragmatic-guide-to-adopting-serverless-computing_yujb1m0t.config index bfead91..a8a1737 100644 --- a/SgfDevs/uSync/v17/Content/a-pragmatic-guide-to-adopting-serverless-computing_yujb1m0t.config +++ b/SgfDevs/uSync/v17/Content/a-pragmatic-guide-to-adopting-serverless-computing_yujb1m0t.config @@ -27,12 +27,43 @@ Ben Ellis is a freelance cloud architect with over 20 years of experience in sof - - - - - - + + + diff --git a/SgfDevs/uSync/v17/Content/a-year-in-web3.config b/SgfDevs/uSync/v17/Content/a-year-in-web3.config index 2339551..59353d3 100644 --- a/SgfDevs/uSync/v17/Content/a-year-in-web3.config +++ b/SgfDevs/uSync/v17/Content/a-year-in-web3.config @@ -25,12 +25,43 @@ - - - - - - + + + diff --git a/SgfDevs/uSync/v17/Content/ai-vibecode-shootout.config b/SgfDevs/uSync/v17/Content/ai-vibecode-shootout.config index dbed204..bad2b03 100644 --- a/SgfDevs/uSync/v17/Content/ai-vibecode-shootout.config +++ b/SgfDevs/uSync/v17/Content/ai-vibecode-shootout.config @@ -41,12 +41,43 @@ Just like previous shootouts, presenters will: - - - - - - + + + diff --git a/SgfDevs/uSync/v17/Content/annual-survey.config b/SgfDevs/uSync/v17/Content/annual-survey.config index da94e1a..e8fc828 100644 --- a/SgfDevs/uSync/v17/Content/annual-survey.config +++ b/SgfDevs/uSync/v17/Content/annual-survey.config @@ -25,12 +25,43 @@ - - - - - - + + + diff --git a/SgfDevs/uSync/v17/Content/apiendpoints-a-better-way-to-build-apis-in-asp.net.config b/SgfDevs/uSync/v17/Content/apiendpoints-a-better-way-to-build-apis-in-asp.net.config index d10b1d6..e762820 100644 --- a/SgfDevs/uSync/v17/Content/apiendpoints-a-better-way-to-build-apis-in-asp.net.config +++ b/SgfDevs/uSync/v17/Content/apiendpoints-a-better-way-to-build-apis-in-asp.net.config @@ -25,12 +25,43 @@ - - - - - - + + + diff --git a/SgfDevs/uSync/v17/Content/apple-silicon-m1-developing-on-an-arm-processor.config b/SgfDevs/uSync/v17/Content/apple-silicon-m1-developing-on-an-arm-processor.config index 4dd0d64..57dbe70 100644 --- a/SgfDevs/uSync/v17/Content/apple-silicon-m1-developing-on-an-arm-processor.config +++ b/SgfDevs/uSync/v17/Content/apple-silicon-m1-developing-on-an-arm-processor.config @@ -27,12 +27,43 @@ Thinking about moving from Intel to a new ARM-based Mac? I will share my experie - - - - - - + + + diff --git a/SgfDevs/uSync/v17/Content/april-5-2025-ten-reasons-your-job-search-isnt-working-presentation-by-ian-schraier.config b/SgfDevs/uSync/v17/Content/april-5-2025-ten-reasons-your-job-search-isnt-working-presentation-by-ian-schraier.config new file mode 100644 index 0000000..70bb777 --- /dev/null +++ b/SgfDevs/uSync/v17/Content/april-5-2025-ten-reasons-your-job-search-isnt-working-presentation-by-ian-schraier.config @@ -0,0 +1,81 @@ + + + + Dev Night - April 2025 (2) + /[-20]/DevNightApril20252/April52025TenReasonsYourJobSearchIsntWorkingPresentationByIanSchraier + true + presentation + 2025-03-30T03:11:45 + + 0 + + +