27-28 March, 2025
Days of Knowledge UK 2025
Join us in Birmingham, the heart of the UK, for Days of Knowledge UK 2025! This local training event offers a unique opportunity for continuous learning in Business Central and related products, mastering cloud and AI technologies and accelerating technology adoption. Stay ahead by gaining the skills to implement modern customer solutions efficiently and connect with the Dynamics community to deliver more value to your clients.
Error executing template "Designs/Swift/Paragraph/COMM_SpeakerWall.cshtml" System.Net.WebException: The remote server returned an error: (404) Not Found. at System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest& request) at System.Net.WebClient.DownloadString(Uri address) at CompiledRazorTemplates.Dynamic.RazorEngine_750bdb2c12264539aee2015b7dfbb96a.GetJson(String address) in C:\inetpub\wwwroot\directions2023_uat\Files\Templates\Designs\Swift\Paragraph\COMM_SpeakerWall.cshtml:line 145 at CompiledRazorTemplates.Dynamic.RazorEngine_750bdb2c12264539aee2015b7dfbb96a.Execute() in C:\inetpub\wwwroot\directions2023_uat\Files\Templates\Designs\Swift\Paragraph\COMM_SpeakerWall.cshtml:line 262 at RazorEngine.Templating.TemplateBase.RazorEngine.Templating.ITemplate.Run(ExecuteContext context, TextWriter reader) at RazorEngine.Templating.RazorEngineService.RunCompile(ITemplateKey key, TextWriter writer, Type modelType, Object model, DynamicViewBag viewBag) at RazorEngine.Templating.RazorEngineServiceExtensions.<>c__DisplayClass16_0.<RunCompile>b__0(TextWriter writer) at RazorEngine.Templating.RazorEngineServiceExtensions.WithWriter(Action`1 withWriter) at Dynamicweb.Rendering.RazorTemplateRenderingProvider.Render(Template template) at Dynamicweb.Rendering.TemplateRenderingService.Render(Template template) at Dynamicweb.Rendering.Template.RenderRazorTemplate()
1 @inherits Dynamicweb.Rendering.ViewModelTemplate<Dynamicweb.Frontend.ParagraphViewModel> @using Dynamicweb.Frontend.Navigation @using Dynamicweb.Content.Items @using Dynamicweb.Frontend @using System.Web.Helpers @using System.Web @using System.Text @using System.Net @using System.Linq @using System @using System.Globalization @using Newtonsoft.Json @using Newtonsoft.Json.Linq @functions{ public class Root { public List<Session> sessions {get; set;} public List<Speaker> speakers {get; set;} public List<Category> categories {get; set;} } public class Session { public string id {get; set;} public string title {get; set;} public string description {get; set;} public DateTime? startsAt {get; set;} public DateTime? endsAt {get; set;} public bool isServiceSession {get; set;} public bool isPlenumSession {get; set;} public List<string> speakers {get; set;} public List<int> categoryItems {get; set;} public List<QuestionAnswers> questionAnswers {get; set;} public int? roomId {get; set;} //liveUrl //recordingUrl } public class categoryItems { public string name { get; set; } } // For Speaker class public class sessions { public int id { get; set; } public string name { get; set; } } // For Speaker class public class categories { public int id { get; set; } public string name { get; set; } public List<Item> categoryItems {get; set;} public int sort { get; set; } } public class Speaker { public string id {get; set;} public string firstName {get; set;} public string lastName {get; set;} public string bio {get; set;} public string tagLine {get; set;} public string profilePicture {get; set;} public bool isTopSpeaker {get; set;} public List<Link> links {get; set;} public List<sessions> sessions {get; set;} public List<categories> categories { get; set; } public string fullName {get; set;} public List<int> categoryItems {get; set;} public List<QuestionAnswers> questionAnswers {get; set;} public int displayPriority {get; set;} } public class Category { public int id {get; set;} public string title {get; set;} public List<Item> items {get; set;} public int sort {get; set;} public string type {get; set;} } public class Link { public string title {get; set;} public string url {get; set;} public string linType {get; set;} } public class Item { public int id {get; set;} public string name {get; set;} public int sort {get; set;} } public class Timeslot { public string Code {get; set;} public DateTime? DateAndStart {get; set;} public DateTime? SlotDate {get; set;} public DateTime SlotDuration {get; set;} public string SlotEnd {get; set;} public string SlotStart {get; set;} public string Status {get; set;} } public class Attribute { public string categoryTitle {get; set;} public int categoryId {get; set;} public int categorySort {get; set;} public int attributeId {get; set;} public string attributeName {get; set;} public int attributeSort {get; set;} } public string GetTimeslot(Session session) { string code = session.startsAt != null && session.endsAt != null ? session.startsAt.ToString().GetHashCode().ToString("x") + session.endsAt.ToString().GetHashCode().ToString("x") : "UNDEFINED"; return code; } public class QuestionAnswers { public string questionId {get; set;} public string answerValue {get; set;} } static string GetJson(string address) { using (var client = new WebClient()) { client.Headers.Add("Content-Type", "application/json"); try { return client.DownloadString(address); } catch (InvalidCastException e) { return ""; } } } string makeStringReadable(string data){ string myStr = data; byte[] bytes = Encoding.Default.GetBytes(myStr); return Encoding.UTF8.GetString(bytes); } //we define variables for acces in other helpers string theme = ""; bool showSummary = false; string sessionDetailsPage = ""; } @{ var parentPages = Dynamicweb.Content.Services.Pages.GetAncestors(Pageview.Page.ID, true); Dynamicweb.Content.Page rootPage = parentPages.Any() ? parentPages.Where(x => x.ItemType == "COMM_EventSection").FirstOrDefault() : new Dynamicweb.Content.Page(); theme = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("Theme")) && Model.Item.GetRawValueString("Theme") != "no-theme" ? " theme " + Model.Item.GetRawValueString("Theme").Replace(" ", "").Trim().ToLower() : ""; var item = Dynamicweb.Content.Services.Items.GetItem(rootPage.ItemType, rootPage.ItemId); var sessionizeCode = item?["SessionizeCode"].ToString() ?? ""; var parentTheme = !string.IsNullOrEmpty(item?["Theme"].ToString()) ? "theme " + item?["Theme"].ToString() : ""; var eventCode = !string.IsNullOrEmpty(Model.Item?.GetString("SessionizeCode")) ? Model.Item?.GetString("SessionizeCode") : sessionizeCode; sessionDetailsPage = !string.IsNullOrEmpty(Model.Item?.GetString("SessionDetailPage")) ? Dynamicweb.Frontend.SearchEngineFriendlyURLs.GetFriendlyUrl(Model.Item?.GetString("SessionDetailPage")) : ""; theme = theme != "" ? theme : parentTheme; showSummary = Model.Item.GetBoolean("ShowSummaryOnly"); string eyebrow = Model.Item.GetString("Eyebrow", string.Empty).Replace(System.Environment.NewLine, "<br>"); string eyebrowHeadingLevel = Model.Item.GetString("EyebrowHeadingLevel", "h3"); string eyebrowFontSize = Model.Item.GetRawValueString("EyebrowFontSize", "h5"); string eyebrowColor = Model.Item.GetString("EyebrowColor", "text-inherit"); string eyebrowTextOpacity = Model.Item.GetString("EyebrowTextOpacity", "opacity-100"); string eyebrowCssClass = Model.Item.GetString("EyebrowCssClass", string.Empty); string eyebrowSpacingBottomDesktop = Model.Item.GetRawValueString("EyebrowSpacingBottomDesktop", "default"); eyebrowSpacingBottomDesktop = eyebrowSpacingBottomDesktop != "default" ? eyebrowSpacingBottomDesktop : string.Empty; string eyebrowSpacingBottomMobile = Model.Item.GetRawValueString("EyebrowSpacingBottomMobile", "default"); eyebrowSpacingBottomMobile = eyebrowSpacingBottomMobile != "default" ? eyebrowSpacingBottomMobile : string.Empty; string title = Model.Item.GetString("Title", string.Empty).Replace(System.Environment.NewLine, "<br>"); string titleHeadingLevel = Model.Item.GetString("TitleHeadingLevel", "h2"); string titleFontSize = Model.Item.GetRawValueString("TitleFontSize", "h2"); string titleColor = Model.Item.GetString("TitleColor", "text-inherit"); string titleTextOpacity = Model.Item.GetString("TitleTextOpacity", "opacity-100"); string titleCssClass = Model.Item.GetString("TitleCssClass", string.Empty); string titleSpacingBottomDesktop = Model.Item.GetRawValueString("TitleSpacingBottomDesktop", "default"); titleSpacingBottomDesktop = titleSpacingBottomDesktop != "default" ? titleSpacingBottomDesktop : string.Empty; string titleSpacingBottomMobile = Model.Item.GetRawValueString("TitleSpacingBottomMobile", "default"); titleSpacingBottomMobile = titleSpacingBottomMobile != "default" ? titleSpacingBottomMobile : string.Empty; string subtitle = Model.Item.GetString("Subtitle", string.Empty).Replace(System.Environment.NewLine, "<br>"); string subtitleHeadingLevel = Model.Item.GetString("SubtitleHeadingLevel", "p"); string subtitleFontSize = Model.Item.GetRawValueString("SubtitleFontSize", "fs-5"); string subtitleColor = Model.Item.GetString("SubtitleColor", "text-inherit"); string subtitleTextOpacity = Model.Item.GetString("SubtitleTextOpacity", "opacity-100"); string subtitleCssClass = Model.Item.GetString("SubtitleCssClass", string.Empty); string subtitleSpacingBottomDesktop = Model.Item.GetRawValueString("SubtitleSpacingBottomDesktop", "default"); subtitleSpacingBottomDesktop = subtitleSpacingBottomDesktop != "default" ? subtitleSpacingBottomDesktop : string.Empty; string subtitleSpacingBottomMobile = Model.Item.GetRawValueString("SubtitleSpacingBottomMobile", "default"); subtitleSpacingBottomMobile = subtitleSpacingBottomMobile != "default" ? subtitleSpacingBottomMobile : string.Empty; //Button 1 var button1Link = Model.Item.GetLink("Button1Link"); var button1Label = Model.Item.GetString("Button1Label", string.Empty); var button1Icon = Model.Item.GetRawValueString("Button1Icon"); var button1IconPosition = Model.Item.GetRawValueString("Button1IconPosition", "right"); var button1Style = Model.Item.GetRawValueString("Button1Style", "btn-primary"); //Button 2 var button2Link = Model.Item.GetLink("Button2Link"); var button2Label = Model.Item.GetString("Button2Label", string.Empty); var button2Icon = Model.Item.GetRawValueString("Button2Icon"); var button2IconPosition = Model.Item.GetRawValueString("Button2IconPosition", "right"); var button2Style = Model.Item.GetRawValueString("Button2Style", "btn-primary"); string contentAlignment = "align-items-center justify-content-center"; string contentTextAlignment = "text-start"; string renderTextCss = showSummary ? "d-none" : ""; string layout = Model.Item.GetRawValueString("DisplayMode"); string gridLayout = Model.Item.GetRawValueString("GridLayout"); } <div class="h-100 item_@Model.Item.SystemName.ToLower()"> <div class="@renderTextCss"> @if (!string.IsNullOrEmpty(eyebrow)) { @RenderContent(eyebrow, eyebrowHeadingLevel, eyebrowFontSize, eyebrowColor, eyebrowTextOpacity, eyebrowSpacingBottomDesktop, eyebrowSpacingBottomMobile, eyebrowCssClass) } @if (!string.IsNullOrEmpty(title)) { @RenderContent(title, titleHeadingLevel, titleFontSize, titleColor, titleTextOpacity, titleSpacingBottomDesktop, titleSpacingBottomMobile, titleCssClass) } @if (!string.IsNullOrEmpty(subtitle)) { @RenderContent(subtitle, subtitleHeadingLevel, subtitleFontSize, subtitleColor, subtitleTextOpacity, subtitleSpacingBottomDesktop, subtitleSpacingBottomMobile, subtitleCssClass) } </div> @if (!string.IsNullOrEmpty(eventCode)) { string sessionizeSpeakers = "https://sessionize.com/api/v2/"+ sessionizeCode + "/view/Speakers"; string response = GetJson(sessionizeSpeakers).ToString(); var speakers = JsonConvert.DeserializeObject<List<Speaker>>(response); //extend speakers with DisplayPriority property List<Speaker> updatedSpeakers = new List<Speaker>(); foreach(var speaker in speakers) { var speakerCategories = speaker.categories; var speakerDisplayPriorities = speakerCategories != null ? speakerCategories.Where(c => c.name =="DisplayPriority")?.FirstOrDefault() : new categories(); var categoryItems = speakerDisplayPriorities != null ? speakerDisplayPriorities.categoryItems : new List<Item>(); Item priority = categoryItems.Any() ? categoryItems.FirstOrDefault() : new Item();//speaker.categories != null ? speaker.categories.Where(c => c.name =="DisplayPriority")?.FirstOrDefault().categoryItems?.FirstOrDefault() : new Item(); //var priority = speaker.categories.Where(c => c.name =="DisplayPriority")?.FirstOrDefault().categoryItems?.FirstOrDefault();// : new Item(); Speaker updatedSpeaker = new Speaker(); updatedSpeaker = speaker; updatedSpeaker.displayPriority = priority.name != null ? Dynamicweb.Core.Converter.ToInt32(priority.name) : 99; updatedSpeakers.Add(updatedSpeaker); } //sort speakers by display priority speakers = updatedSpeakers.OrderBy(x=>x.displayPriority).ThenBy(x=>x.lastName).ToList(); if(speakers.Any()) { @RenderSpeakers(speakers , showSummary , theme , sessionDetailsPage, layout, gridLayout) } } else { <div class="alert alert-info" role="alert"> <span>@Translate("Missing sessionize Id")</span> </div> } </div> @helper RenderSpeakers(System.Collections.Generic.List<Speaker> speakers, bool showSummary , string theme , string sessionDetailsPage, string layout, string gridLayout) { string iconBadgeWidth = Model.Item.GetString("IconBadgeWidth"); string iconBadgeHeight = Model.Item.GetString("IconBadgeHeight"); var summaryCss = showSummary ? "grid-auto-rows-1-fr" : ""; var gridCss = !showSummary ? "grid" : "container-lg p-0"; int categoryParameter = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString["Category"]) ? Convert.ToInt32(Dynamicweb.Context.Current.Request.QueryString["Category"]) : 0; bool isSlider = layout == "carousel"; var filtersList = new string []{"SpeakerType"}; bool hideSpeakerCategory = Model.Item.GetBoolean("HideSpeakerCategory"); List<Attribute> sessionizeAttributes = new List<Attribute>(); foreach (var speaker in speakers) { foreach(var category in speaker.categories) { foreach(var element in category.categoryItems) { if(category.name == "SpeakerType") { Attribute attribute = new Attribute(); attribute.categoryTitle = category.name; attribute.categoryId = category.id; attribute.categorySort = category.sort; attribute.attributeId = element.id; attribute.attributeName = element.name; // attribute.attributeSort = element.sort; sessionizeAttributes.Add(attribute); } } } } //Remove grouping var groupedAttributes = sessionizeAttributes.GroupBy( attr => attr.categoryTitle, (key, g) => new { Title = key, Items = g.GroupBy(x => x.attributeId).Select(x => x.First()).ToList() }); string categoryId = Model.Item.GetRawValueString("CategoryId"); if (!showSummary && string.IsNullOrEmpty(categoryId)) { <div class="grid mb-3"> @{ Uri url = Dynamicweb.Context.Current.Request.Url; var query = System.Web.HttpUtility.ParseQueryString(url.Query); query.Remove("Category"); var link = new UriBuilder( url ) { Query = query.ToString() }.Uri; } @foreach (var attrCollection in groupedAttributes) { foreach (var attr in attrCollection.Items.Where(item => item.attributeId == categoryParameter)) { <a href="@link" class="px-0 g-col-lg-3 g-col-12 btn btn-link btn-sm d-flex justify-content-between align-items-center"> <span>@attrCollection.Title : @attr.attributeName</span> <span class="btn-close btn-sm" aria-label="Close"></span> </a> } } </div> <div class="grid mb-4"> <div class="g-col-lg-3 g-col-12"> <div class="form-group"> <label class="fw-bold mb-2" for="searchSpeaker">@Translate("Search")</label> <input type="search" class="form-control" id="searchSpeaker" placeholder="@Translate("Enter speaker name...")"></input> </div> </div> <div class="g-col-lg-3 g-col-12"> <label class="fw-bold mb-2" for="Category">@Translate("Category")</label> <select class="form-control filter-session-ref filter-session-trigger speaker-category-dropdown-filter" id="Category" name="Category"> <option value="">@Translate("Choose category")</option> @foreach (var attrCollection in groupedAttributes) { @*<optgroup label="@attrCollection.Title">*@ foreach (var attr in attrCollection.Items) { var selectedAttr = attr.attributeId == categoryParameter ? "selected" : ""; <option value="@attr.attributeId" @selectedAttr>@attr.attributeName</option> } @*</optgroup>*@ } </select> </div> <div class="g-col-lg-3 g-col-12 d-flex justify-content-start align-items-end"> <a class="btn btn-link p-0 clear-all-speaker-filters" data-params-to-remove="Category">@Translate("Clear all")</a> </div> </div> } if (speakers.Any()) { speakers = !string.IsNullOrEmpty(categoryId) ? speakers.Where(speaker => speaker.categories.Any(i => i.categoryItems.Any(cat => cat.id.ToString().Equals(categoryId)))).ToList() : speakers; int summaryItemsCount = Model.Item.GetInt32("SummaryItemsCount"); summaryItemsCount = summaryItemsCount > speakers.Count() ? speakers.Count() : summaryItemsCount; int displayCount = showSummary ? summaryItemsCount : speakers.Count(); if (showSummary) { string eyebrow = Model.Item.GetString("Eyebrow", string.Empty).Replace(System.Environment.NewLine, "<br>"); string eyebrowHeadingLevel = Model.Item.GetString("EyebrowHeadingLevel", "h3"); string eyebrowFontSize = Model.Item.GetRawValueString("EyebrowFontSize", "h5"); string eyebrowColor = Model.Item.GetString("EyebrowColor", "text-inherit"); string eyebrowTextOpacity = Model.Item.GetString("EyebrowTextOpacity", "opacity-100"); string eyebrowCssClass = Model.Item.GetString("EyebrowCssClass", string.Empty); string eyebrowSpacingBottomDesktop = Model.Item.GetRawValueString("EyebrowSpacingBottomDesktop", "default"); eyebrowSpacingBottomDesktop = eyebrowSpacingBottomDesktop != "default" ? eyebrowSpacingBottomDesktop : string.Empty; string eyebrowSpacingBottomMobile = Model.Item.GetRawValueString("EyebrowSpacingBottomMobile", "default"); eyebrowSpacingBottomMobile = eyebrowSpacingBottomMobile != "default" ? eyebrowSpacingBottomMobile : string.Empty; string title = Model.Item.GetString("Title", string.Empty).Replace(System.Environment.NewLine, "<br>"); string titleHeadingLevel = Model.Item.GetString("TitleHeadingLevel", "h2"); string titleFontSize = Model.Item.GetRawValueString("TitleFontSize", "h2"); string titleColor = Model.Item.GetString("TitleColor", "text-inherit"); string titleTextOpacity = Model.Item.GetString("TitleTextOpacity", "opacity-100"); string titleCssClass = Model.Item.GetString("TitleCssClass", string.Empty); string titleSpacingBottomDesktop = Model.Item.GetRawValueString("TitleSpacingBottomDesktop", "default"); titleSpacingBottomDesktop = titleSpacingBottomDesktop != "default" ? titleSpacingBottomDesktop : string.Empty; string titleSpacingBottomMobile = Model.Item.GetRawValueString("TitleSpacingBottomMobile", "default"); titleSpacingBottomMobile = titleSpacingBottomMobile != "default" ? titleSpacingBottomMobile : string.Empty; string subtitle = Model.Item.GetString("Subtitle", string.Empty).Replace(System.Environment.NewLine, "<br>"); string subtitleHeadingLevel = Model.Item.GetString("SubtitleHeadingLevel", "p"); string subtitleFontSize = Model.Item.GetRawValueString("SubtitleFontSize", "fs-5"); string subtitleColor = Model.Item.GetString("SubtitleColor", "text-inherit"); string subtitleTextOpacity = Model.Item.GetString("SubtitleTextOpacity", "opacity-100"); string subtitleCssClass = Model.Item.GetString("SubtitleCssClass", string.Empty); string subtitleSpacingBottomDesktop = Model.Item.GetRawValueString("SubtitleSpacingBottomDesktop", "default"); subtitleSpacingBottomDesktop = subtitleSpacingBottomDesktop != "default" ? subtitleSpacingBottomDesktop : string.Empty; string subtitleSpacingBottomMobile = Model.Item.GetRawValueString("SubtitleSpacingBottomMobile", "default"); subtitleSpacingBottomMobile = subtitleSpacingBottomMobile != "default" ? subtitleSpacingBottomMobile : string.Empty; //Button 1 var button1Link = Model.Item.GetLink("Button1Link"); var button1Label = Model.Item.GetString("Button1Label", string.Empty); var button1Icon = Model.Item.GetRawValueString("Button1Icon"); var button1IconPosition = Model.Item.GetRawValueString("Button1IconPosition", "right"); var button1Style = Model.Item.GetRawValueString("Button1Style", "btn-primary"); //Button 2 var button2Link = Model.Item.GetLink("Button2Link"); var button2Label = Model.Item.GetString("Button2Label", string.Empty); var button2Icon = Model.Item.GetRawValueString("Button2Icon"); var button2IconPosition = Model.Item.GetRawValueString("Button2IconPosition", "right"); var button2Style = Model.Item.GetRawValueString("Button2Style", "btn-primary"); string contentAlignment = "align-items-center justify-content-center"; string contentTextAlignment = "text-start"; var count = 0; speakers = speakers.Where((speaker, index) => index < displayCount).ToList(); var summarySpeakers = speakers.Select((speaker, index) => new {speaker, index}) .GroupBy(g => g.index <= 5, (key, g) => new { Title = key, Items = g.ToList() }); string sliderCss = isSlider ? "swiffy-slider slider-nav-visible slider-nav-round" : ""; string sliderListCss = isSlider ? "slider-container" : "container"; <div class="@gridCss"> <div id="Slider_@Model.ID" class="@sliderCss speaker-wall-preview"> <div class="g-col-12 w-100 d-flex align-items-end justify-content-between gap-3 flex-wrap mb-4"> <div> @if (!string.IsNullOrEmpty(eyebrow)) { @RenderContent(eyebrow, eyebrowHeadingLevel, eyebrowFontSize, eyebrowColor, eyebrowTextOpacity, eyebrowSpacingBottomDesktop, eyebrowSpacingBottomMobile, eyebrowCssClass) } @if (!string.IsNullOrEmpty(title)) { @RenderContent(title, titleHeadingLevel, titleFontSize, titleColor, titleTextOpacity, titleSpacingBottomDesktop, titleSpacingBottomMobile, titleCssClass) } @if (!string.IsNullOrEmpty(subtitle)) { @RenderContent(subtitle, subtitleHeadingLevel, subtitleFontSize, subtitleColor, subtitleTextOpacity, subtitleSpacingBottomDesktop, subtitleSpacingBottomMobile, subtitleCssClass) } </div> <div class="d-flex gap-3 align-items-stretch"> <div> @if (button1Link is object || button2Link is object) { if (contentTextAlignment == "text-start") { contentAlignment = "justify-content-start"; } if (contentTextAlignment == "text-center") { contentAlignment = "justify-content-center"; } if (contentTextAlignment == "text-end") { contentAlignment = "justify-content-end"; } <div class="d-flex flex-wrap @(contentAlignment) gap-3"> @if (button1Link is object && !string.IsNullOrEmpty(button1Label)) { button1Style = button1Style + " rounded-7 btn-sm"; @RenderButton(button1Link, button1Label, button1Style, button1Icon, button1IconPosition) } @if (button2Link is object && !string.IsNullOrEmpty(button1Label)) { @RenderButton(button2Link, button2Label, button2Style, button2Icon, button2IconPosition) } </div> } </div> <div class="d-flex"> <button type="button" title="@Translate("Previous slide")" class="btn btn-primary slider-nav position-relative p-lg-3 rounded-7-start bg-black text-white" style="z-index:1;max-height: 2.75em;min-height: 2.75em"> <span class="icon-auto"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="feather feather-arrow-left"><line x1="19" y1="12" x2="5" y2="12"></line><polyline points="12 19 5 12 12 5"></polyline></svg> </span> <span class="visually-hidden">@Translate("Previous slide")</span> </button> <button type="button" title="@Translate("Next slide")" class="btn btn-primary slider-nav slider-nav-next position-relative p-lg-3 rounded-7-end bg-black text-white" style="z-index:1;max-height: 2.75em;min-height: 2.75em"> <span class="icon-auto"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="feather feather-arrow-right"><line x1="5" y1="12" x2="19" y2="12"></line><polyline points="12 5 19 12 12 19"></polyline></svg> </span> <span class="visually-hidden">@Translate("Next slide")</span> </button> </div> </div> </div> <ul class="@sliderListCss"> @foreach (var _i in summarySpeakers) { <li class="grid speaker-slider"> @foreach (var _item in _i.Items.Take(6)) { count++; string viewSpeakerInfoTranslate = Translate("View") + " " + _item.speaker.fullName + " " + Translate("info"); string speakerName = _item.speaker.fullName != null ? _item.speaker.fullName.ToString() : ""; string speakerBio = _item.speaker.bio != null ? _item.speaker.bio.ToString() : ""; string speakerTagLine = _item.speaker.tagLine != null ? _item.speaker.tagLine.ToString() : ""; string speakerProfilePicture = _item.speaker.profilePicture != null ? _item.speaker.profilePicture.ToString() : ""; var sessionsTranslate = _item.speaker.sessions.Count() > 1 ? Translate("Sessions") : Translate("Session"); var speakerTypeList = _item.speaker.categories.Where(cat => cat.name == "SpeakerType") ?? null; <div class="speaker h-100 grid grid-12 gap-lg-4 @theme gap-2 position-relative rounded-7"> <div class="h-100 p-4 g-col-md-6 g-col-12 order-last order-md-first d-flex flex-column gap-1 max-h-15-em"> <a href="#" class="btn btn-link p-0 text-decoration-none" title="@viewSpeakerInfoTranslate" onclick="event.preventDefault(); new bootstrap.Modal(document.getElementById('SpeakerModal_@(count - 1)')).show()"> <h5 class="text-start">@makeStringReadable(speakerName)</h5> </a> <p class="fs-7 m-0">@speakerTagLine</p> @if (speakerTypeList != null) { <div class="d-flex gap-2 mt-2"> @foreach (var cat in speakerTypeList) { foreach (var c in cat.categoryItems) { string badgePath = "/Files/Images/"; if (c.name.Equals("Microsoft")) { badgePath += "microsoftIconBadge.png"; } else if (c.name.Equals("Sponsor")) { badgePath += "sponsorIconBadge.png"; } else if (c.name.Equals("MVP")) { badgePath += "mvpIconBadge.png"; } else if (c.name.Equals("Directions")) { badgePath += "directionsIconBadge.png"; } else { badgePath = badgePath; } <img height="@iconBadgeHeight" width="@iconBadgeWidth" src="@badgePath" class="rounded-0"></img> } } </div> } </div> <div class="h-100 g-col-md-6 g-col-12 overflow-hidden rounded-7"> <a class="btn btn-link p-0" title="@viewSpeakerInfoTranslate" onclick="new bootstrap.Modal(document.getElementById('SpeakerModal_@(count - 1)')).show()"> <img src="@speakerProfilePicture" class="w-100 img-fluid rounded-7"></img> </a> </div> </div> } </li> } </ul> @for (int x = 0; x < displayCount; x++) { string viewSpeakerInfoTranslate = Translate("View") + " " + speakers[x].fullName + " " + Translate("info"); string speakerName = speakers[x].fullName != null ? speakers[x].fullName.ToString() : ""; string speakerBio = speakers[x].bio != null ? speakers[x].bio.ToString() : ""; string speakerTagLine = speakers[x].tagLine != null ? speakers[x].tagLine.ToString() : ""; string speakerProfilePicture = speakers[x].profilePicture != null ? speakers[x].profilePicture.ToString() : ""; string speakerCategories = speakers[x].categoryItems != null ? String.Join(",", speakers[x].categoryItems) : ""; var sessionsTranslate = speakers[x].sessions.Count() > 1 ? Translate("Sessions") : Translate("Session"); var speakerTypeList = speakers[x].categories.Where(cat => cat.name == "SpeakerType") ?? null; <div class="modal fade" id="SpeakerModal_@x"> <div class="modal-dialog modal-xl"> <div class="modal-content @theme rounded-7"> <div class="modal-body p-0" id="SpeakerModalBodyContainer_@x"> <div class="close-container position-absolute p-3 end-0 m-3 bg-white rounded-7 z-index-9"> <button type="button" class="btn-close bg-dark z-index-9" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="grid @theme gap-0 rounded-7"> <div class="h-100 g-col-lg-7 g-col-12 order-last order-md-first"> <div class="h-100 p-4 overflow-auto max-h-30-em"> <div> <h5>@makeStringReadable(speakerName)</h5> <p>@speakerTagLine</p> </div> <div class="d-flex flex-column gap-3 justify-content-between overflow-auto max-h-15-em"> <p class="m-0">@makeStringReadable(speakerBio)</p> </div> <div class="mt-4 d-grid"> <p class="m-0 fw-bold">@sessionsTranslate</p> @foreach (var session in speakers[x].sessions) { if (!string.IsNullOrEmpty(sessionDetailsPage)) { var sessionLink = sessionDetailsPage.IndexOf("?") > 0 ? sessionDetailsPage + "&session=" + session.id : sessionDetailsPage + "?session=" + session.id; <a class="btn btn-link text-start p-0 mb-2" title="@makeStringReadable(session.name)" href="@sessionLink"> @makeStringReadable(session.name) </a> } else { <p class="mb-2">@makeStringReadable(session.name)</p> } } </div> @if (speakerTypeList != null) { <div class="d-flex gap-2"> @foreach (var cat in speakerTypeList) { foreach (var c in cat.categoryItems) { string badgePath = "/Files/Images/"; if (c.name.Equals("Microsoft")) { badgePath += "microsoftIconBadge.png"; } else if (c.name.Equals("Sponsor")) { badgePath += "sponsorIconBadge.png"; } else if (c.name.Equals("MVP")) { badgePath += "mvpIconBadge.png"; } else if (c.name.Equals("Directions")) { badgePath += "directionsIconBadge.png"; } else { badgePath = badgePath; } <img height="@iconBadgeHeight" width="@iconBadgeWidth" src="@badgePath" class="rounded-0"></img> } } </div> } </div> </div> <div class="h-100 g-col-lg-5 g-col-12"> <img src="@speakerProfilePicture" class="h-100 w-100 img-fluid rounded-7"></img> </div> </div> </div> </div> </div> </div> } </div> </div> } else { var level1Speakers = speakers.Where(s => s.displayPriority == 1).ToList(); var level2Speakers = speakers.Where(s => s.displayPriority == 2); var level3Speakers = speakers.Where(s => s.displayPriority > 2); if (categoryParameter != 0) { level1Speakers = level1Speakers.Where(speaker => speaker.categories.Any(i => i.categoryItems.Any(cat => cat.id.Equals(categoryParameter)))).ToList(); level2Speakers = level2Speakers.Where(speaker => speaker.categories.Any(i => i.categoryItems.Any(cat => cat.id.Equals(categoryParameter)))).ToList(); level3Speakers = level3Speakers.Where(speaker => speaker.categories.Any(i => i.categoryItems.Any(cat => cat.id.Equals(categoryParameter)))).ToList(); } string topSpeakersCarouselWidth = Model.Item.GetRawValueString("TopSpeakersCarouselWidth", "w-100"); <div class="d-grid mb-3"> @if (level1Speakers.Any() && !hideSpeakerCategory) { <h4 class="mb-4">@Translate("SpeakerWall_DisplayOrder_1")</h4> } <div id="Slider_@Model.ID" class="@(topSpeakersCarouselWidth) m-auto d-grid swiffy-slider slider-nav-visible slider-nav-round slider-nav-autoplay slider-nav-autopause speaker-wall-preview"> @RenderSpeakerSlider(level1Speakers, 6) </div> @*foreach(var speaker in level1Speakers) { @RenderSpeaker(speaker) } *@ </div> if (level1Speakers.Any() && !hideSpeakerCategory) { <hr class="my-5"> } <div class="@gridCss mb-3"> @if (level2Speakers.Any() && !hideSpeakerCategory) { <h4 class="mb-4 g-col-12">@Translate("SpeakerWall_DisplayOrder_2")</h4> } @foreach (var speaker in level2Speakers) { @RenderSpeaker(speaker) } </div> if (level2Speakers.Any() && !hideSpeakerCategory) { <hr class="my-5"> } <div class="@gridCss mb-3"> @if (level3Speakers.Any() && !hideSpeakerCategory) { <h4 class="mb-4 g-col-12">@Translate("SpeakerWall_DisplayOrder_3")</h4> } @foreach(var speaker in level3Speakers) { @RenderSpeaker(speaker) } </div> } } } @helper RenderContent(string content, string heading, string fontSize, string color, string opacity, string margin, string marginMobile, string cssClass) { var classes = new List<string> { }; if (!string.IsNullOrEmpty(fontSize)) { classes.Add(fontSize); } if (!string.IsNullOrEmpty(color)) { classes.Add(color); } if (!string.IsNullOrEmpty(opacity)) { classes.Add(opacity); } if (!string.IsNullOrEmpty(margin)) { classes.Add(margin); } if (!string.IsNullOrEmpty(marginMobile)) { classes.Add(marginMobile); } if (!string.IsNullOrEmpty(cssClass)) { classes.Add(cssClass); } var tagStart = $"<{heading} class=\"{string.Join(" ", classes)}\">"; var tagEnd = $"</{heading}>"; @tagStart @content @tagEnd } @helper RenderButton(Dynamicweb.Frontend.LinkViewModel link, string label, string style, string icon, string iconPosition) { string target = Pageview.AreaSettings.GetBoolean("OpenLinksInNewTab") && link.IsExternal ? "target=\"_blank\"" : string.Empty; string rel = Pageview.AreaSettings.GetBoolean("OpenLinksInNewTab") && link.IsExternal ? "rel=\"noopener\"" : string.Empty; <a href="@link.Url" @target @rel class="btn @(style)"> @if (icon is object) { <span class="d-flex align-items-center gap-1 @(iconPosition)"> @label @RenderIcon(icon) </span> } else { @label } </a> } @helper RenderIcon(string icon) { if (System.IO.Path.GetExtension(icon).ToLower() == ".svg") { if (!icon.ToLower().Contains("none") && icon != string.Empty) { <span class="icon-auto"> @ReadFile(icon) </span> } } } @helper RenderSpeaker (Speaker speaker) { string iconBadgeWidth = Model.Item.GetString("IconBadgeWidth"); string iconBadgeHeight = Model.Item.GetString("IconBadgeHeight"); var columnSize = "grid g-col-xl-4 g-col-lg-6 g-col-md-6 g-col-12"; columnSize = speaker.displayPriority == 1 ? "grid g-col-lg-12 g-col-12" : columnSize; columnSize = speaker.displayPriority == 2 ? "grid g-col-lg-6 g-col-12" : columnSize; string viewSpeakerInfoTranslate = Translate("View") + " " + speaker.fullName + " " + Translate("info"); string speakerId = speaker.id; string speakerName = speaker.fullName != null ? speaker.fullName.ToString() : ""; string speakerBio = speaker.bio != null ? speaker.bio.ToString() : ""; string speakerTagLine = speaker.tagLine != null ? speaker.tagLine.ToString() : ""; string speakerProfilePicture = speaker.profilePicture != null ? speaker.profilePicture.ToString() : ""; string speakerCategories = speaker.categoryItems != null ? String.Join(",", speaker.categoryItems) : ""; string tagLineCssClass = "fs-7 m-0";//i == 0 ? string.Empty : "fs-7 m-0"; var sessionsTranslate = speaker.sessions.Count() > 1 ? Translate("Sessions") : Translate("Session"); var speakerTypeList = speaker.categories.Where(cat => cat.name == "SpeakerType") ?? null; var speakerDisplayPriority = speaker.displayPriority.ToString(); <div class="speaker @columnSize @theme gap-0 position-relative rounded-7 toggle-speaker" data-name="@makeStringReadable(speakerName)"> <div class="h-100 g-col-lg-7 g-col-12 order-last order-lg-first"> <div class="h-100 p-4 d-flex flex-column justify-content-between"> <div class="d-flex flex-column"> <a href="#" class="btn btn-link p-0 text-decoration-none" title="@viewSpeakerInfoTranslate" onclick="event.preventDefault(); new bootstrap.Modal(document.getElementById('SpeakerModal_@speakerId')).show()"> <h5 class="text-start m-0">@makeStringReadable(speakerName)</h5> </a> <p class="@tagLineCssClass">@speakerTagLine</p> </div> <div class="d-flex flex-column gap-3 justify-content-between max-height-inherit overflow-auto"> @*if (i == 0 && !showSummary) { <p class="m-0">@makeStringReadable(speakerBio)</p> }*@ </div> @if (speakerTypeList != null) { <div class="d-flex gap-2"> @foreach (var cat in speakerTypeList) { foreach (var c in cat.categoryItems) { string badgePath = "/Files/Images/"; if (c.name.Equals("Microsoft")) { badgePath += "microsoftIconBadge.png"; } else if (c.name.Equals("Sponsor")) { badgePath += "sponsorIconBadge.png"; } else if (c.name.Equals("MVP")) { badgePath += "mvpIconBadge.png"; } else if (c.name.Equals("Directions")) { badgePath += "directionsIconBadge.png"; } else { badgePath = badgePath; } <img height="@iconBadgeHeight" width="@iconBadgeWidth" src="@badgePath" class="rounded-0"></img> } } </div> } </div> </div> <div class="h-100 g-col-lg-5 g-col-12 rounded-7"> <a class="btn btn-link p-0 d-flex" title="@viewSpeakerInfoTranslate" onclick="new bootstrap.Modal(document.getElementById('SpeakerModal_@speakerId')).show()"> <img src="@speakerProfilePicture" class="w-100 img-fluid rounded-7"></img> </a> </div> <div class="h-100 w-100 position-absolute cursor-pointer d-none"> <a class="btn btn-link stretched-link" title="@viewSpeakerInfoTranslate" onclick="new bootstrap.Modal(document.getElementById('SpeakerModal_@speakerId')).show()"></a> </div> </div> <div class="modal fade" id="SpeakerModal_@speakerId"> <div class="modal-dialog modal-xl"> <div class="modal-content @theme rounded-7"> <div class="modal-body p-0" id="SpeakerModalBodyContainer_@speakerId"> <div class="close-container position-absolute p-3 end-0 m-3 bg-white rounded-7 z-index-9"> <button type="button" class="btn-close bg-dark z-index-9" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="grid @theme gap-0 rounded-7"> <div class="h-100 g-col-lg-7 g-col-12 order-last order-md-first"> <div class="h-100 p-4 overflow-auto max-h-30-em"> <div> <h5>@makeStringReadable(speakerName)</h5> <p>@speakerTagLine</p> </div> <div class="d-flex flex-column gap-3 justify-content-between overflow-auto max-h-15-em"> <p class="m-0">@makeStringReadable(speakerBio)</p> </div> @if (speakerTypeList != null) { <div class="d-flex gap-2 mt-4"> @foreach (var cat in speakerTypeList) { foreach (var c in cat.categoryItems) { string badgePath = "/Files/Images/"; if (c.name.Equals("Microsoft")) { badgePath += "microsoftIconBadge.png"; } else if (c.name.Equals("Sponsor")) { badgePath += "sponsorIconBadge.png"; } else if (c.name.Equals("MVP")) { badgePath += "mvpIconBadge.png"; } else if (c.name.Equals("Directions")) { badgePath += "directionsIconBadge.png"; } else { badgePath = badgePath; } <img height="@iconBadgeHeight" width="@iconBadgeWidth" src="@badgePath" class="rounded-0"></img> } } </div> } <div class="mt-4 d-grid"> <p class="m-0 fw-bold">@sessionsTranslate</p> @foreach (var session in speaker.sessions) { if (!string.IsNullOrEmpty(sessionDetailsPage)) { var sessionLink = sessionDetailsPage.IndexOf("?") > 0 ? sessionDetailsPage + "&session=" + session.id : sessionDetailsPage + "?session=" + session.id; <a class="btn btn-link text-start p-0 mb-2" title="@makeStringReadable(session.name)" href="@sessionLink"> @makeStringReadable(session.name) </a> } else { <p class="mb-2">@makeStringReadable(session.name)</p> } } </div> @if (speaker.links.Any()) { <div class="d-flex gap-3 align-items-end"> @foreach (var link in speaker.links) { string icon = "/Files/Templates/Designs/Swift/Assets/icons/"; if (link.url.Contains("twitter")) { icon += "twitter.svg"; } else if (link.url.Contains("linkedin")) { icon += "linkedin.svg"; } else { icon += "link.svg"; } <a href="@link.url" title="@link.title" target="_blank"> @RenderIcon(icon) </a> } </div> } </div> </div> <div class="h-100 g-col-lg-5 g-col-12"> <img src="@speakerProfilePicture" class="h-100 w-100 img-fluid rounded-7"></img> </div> </div> </div> </div> </div> </div> } @helper RenderSpeakerSlider(List<Speaker> speakers, int pageSize) { string iconBadgeWidth = Model.Item.GetString("IconBadgeWidth"); string iconBadgeHeight = Model.Item.GetString("IconBadgeHeight"); var summarySpeakers = speakers.Select((speaker, index) => new {speaker, index}) .GroupBy(g => g.index < 3, (key, g) => new { Title = key, Items = g.ToList() }); if(speakers.Any()) { <div class="d-flex"> <button type="button" title="@Translate("Previous slide")" class="btn btn-primary slider-nav position-relative p-lg-3 rounded-7-start bg-black text-white" style="z-index:1;max-height: 2.75em;min-height: 2.75em"> <span class="icon-auto"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="feather feather-arrow-left"><line x1="19" y1="12" x2="5" y2="12"></line><polyline points="12 19 5 12 12 5"></polyline></svg> </span> <span class="visually-hidden">@Translate("Previous slide")</span> </button> <button type="button" title="@Translate("Next slide")" class="btn btn-primary slider-nav slider-nav-next position-relative p-lg-3 rounded-7-end bg-black text-white" style="z-index:1;max-height: 2.75em;min-height: 2.75em"> <span class="icon-auto"> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round" class="feather feather-arrow-right"><line x1="5" y1="12" x2="19" y2="12"></line><polyline points="12 5 19 12 12 19"></polyline></svg> </span> <span class="visually-hidden">@Translate("Next slide")</span> </button> </div> <ul class="slider-container"> @foreach (var _speaker in speakers.Take(pageSize)) { string viewSpeakerInfoTranslate = Translate("View") + " " + _speaker.fullName + " " + Translate("info"); string speakerId = _speaker.id; string speakerName = _speaker.fullName != null ? _speaker.fullName.ToString() : ""; string speakerBio = _speaker.bio != null ? _speaker.bio.ToString() : ""; string speakerTagLine = _speaker.tagLine != null ? _speaker.tagLine.ToString() : ""; string speakerProfilePicture = _speaker.profilePicture != null ? _speaker.profilePicture.ToString() : ""; var sessionsTranslate = _speaker.sessions.Count() > 1 ? Translate("Sessions") : Translate("Session"); var speakerTypeList = _speaker.categories.Where(cat => cat.name == "SpeakerType") ?? null; string bioText = speakerBio.Count() > 700 ? speakerBio.Substring(0, 700) + "..." : speakerBio; <li class="toggle-speaker" data-name="@makeStringReadable(speakerName)"> <div class="speaker grid @theme position-relative rounded-7"> <div class="h-100 p-4 g-col-lg-7 g-col-12 order-last order-lg-first d-flex flex-column gap-1"> <a href="#" class="btn btn-link p-0 text-decoration-none" title="@viewSpeakerInfoTranslate" onclick="event.preventDefault(); new bootstrap.Modal(document.getElementById('SpeakerModal_@speakerId')).show()"> <h5 class="text-start">@makeStringReadable(speakerName)</h5> </a> <h5>@speakerTagLine</h5> <div class="h-100 d-flex flex-column justify-content-between"> <div class="d-flex flex-column gap-3 justify-content-between overflow-hidden speaker-bio-container"> <p class="m-0 bio-text fs-lg-7">@makeStringReadable(bioText)</p> </div> <div class="d-flex justify-content-between align-items-center"> @if (speakerTypeList != null) { <div class="d-flex gap-2 mt-2"> @foreach (var cat in speakerTypeList) { foreach (var c in cat.categoryItems) { string badgePath = "/Files/Images/"; if (c.name.Equals("Microsoft")) { badgePath += "microsoftIconBadge.png"; } else if (c.name.Equals("Sponsor")) { badgePath += "sponsorIconBadge.png"; } else if (c.name.Equals("MVP")) { badgePath += "mvpIconBadge.png"; } else if (c.name.Equals("Directions")) { badgePath += "directionsIconBadge.png"; } else { badgePath = badgePath; } <img height="@iconBadgeHeight" width="@iconBadgeWidth" src="@badgePath" class="rounded-0"></img> } } </div> } <div class="mt-2"> <button class="btn btn-primary btn-sm" onclick="event.preventDefault(); new bootstrap.Modal(document.getElementById('SpeakerModal_@speakerId')).show()">@Translate("Read more")</button> </div> </div> </div> </div> <div class="h-100 g-col-lg-5 g-col-12 overflow-hidden rounded-7"> <a class="btn btn-link p-0 w-100" title="@viewSpeakerInfoTranslate" onclick="new bootstrap.Modal(document.getElementById('SpeakerModal_@speakerId')).show()"> <img src="@speakerProfilePicture" class="w-100 img-fluid rounded-7"></img> </a> </div> </div> </li> } </ul> foreach (var speaker in speakers) { string speakerId = speaker.id; string viewSpeakerInfoTranslate = Translate("View") + " " + speaker.fullName + " " + Translate("info"); string speakerName = speaker.fullName != null ? speaker.fullName.ToString() : ""; string speakerBio = speaker.bio != null ? speaker.bio.ToString() : ""; string speakerTagLine = speaker.tagLine != null ? speaker.tagLine.ToString() : ""; string speakerProfilePicture = speaker.profilePicture != null ? speaker.profilePicture.ToString() : ""; string speakerCategories = speaker.categoryItems != null ? String.Join(",", speaker.categoryItems) : ""; var sessionsTranslate = speaker.sessions.Count() > 1 ? Translate("Sessions") : Translate("Session"); var speakerTypeList = speaker.categories.Where(cat => cat.name == "SpeakerType") ?? null; <div class="modal fade" id="SpeakerModal_@speakerId"> <div class="modal-dialog modal-xl"> <div class="modal-content @theme rounded-7"> <div class="modal-body p-0" id="SpeakerModalBodyContainer_@speakerId"> <div class="close-container position-absolute p-3 end-0 m-3 bg-white rounded-7 z-index-9"> <button type="button" class="btn-close bg-dark z-index-9" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="grid @theme gap-0 rounded-7"> <div class="h-100 g-col-lg-7 g-col-12 order-last order-md-first"> <div class="h-100 p-4 overflow-auto max-h-30-em"> <div> <h5>@makeStringReadable(speakerName)</h5> <p>@speakerTagLine</p> </div> <div class="d-flex flex-column gap-3 justify-content-between overflow-auto max-h-15-em"> <p class="m-0">@makeStringReadable(speakerBio)</p> </div> <div class="mt-4 d-grid"> <p class="m-0 fw-bold">@sessionsTranslate</p> @foreach (var session in speaker.sessions) { if (!string.IsNullOrEmpty(sessionDetailsPage)) { var sessionLink = sessionDetailsPage.IndexOf("?") > 0 ? sessionDetailsPage + "&session=" + session.id : sessionDetailsPage + "?session=" + session.id; <a class="btn btn-link text-start p-0 mb-2" title="@makeStringReadable(session.name)" href="@sessionLink"> @makeStringReadable(session.name) </a> } else { <p class="mb-2">@makeStringReadable(session.name)</p> } } </div> @if (speakerTypeList != null) { <div class="d-flex gap-2"> @foreach (var cat in speakerTypeList) { foreach (var c in cat.categoryItems) { string badgePath = "/Files/Images/"; if (c.name.Equals("Microsoft")) { badgePath += "microsoftIconBadge.png"; } else if (c.name.Equals("Sponsor")) { badgePath += "sponsorIconBadge.png"; } else if (c.name.Equals("MVP")) { badgePath += "mvpIconBadge.png"; } else if (c.name.Equals("Directions")) { badgePath += "directionsIconBadge.png"; } else { badgePath = badgePath; } <img height="@iconBadgeHeight" width="@iconBadgeWidth" src="@badgePath" class="rounded-0"></img> } } </div> } </div> </div> <div class="h-100 g-col-lg-5 g-col-12"> <img src="@speakerProfilePicture" class="h-100 w-100 img-fluid rounded-7"></img> </div> </div> </div> </div> </div> </div> } } } <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/slim-select/2.6.0/slimselect.css" integrity="sha512-ijXMfMV6D0xH0UfHpPnqrwbw9cjd4AbjtWbdfVd204tXEtJtvL3TTNztvqqr9AbLcCiuNTvqHL5c9v2hOjdjpA==" crossorigin="anonymous" referrerpolicy="no-referrer" /> <script src="https://cdnjs.cloudflare.com/ajax/libs/slim-select/2.6.0/slimselect.min.js" integrity="sha512-0E8oaoA2v32h26IycsmRDShtQ8kMgD91zWVBxdIvUCjU3xBw81PV61QBsBqNQpWkp/zYJZip8Ag3ifmzz1wCKQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script> <script type="module" src="/Files/Templates/Designs/Swift/Assets/js/swiffy-slider.js"></script> <link rel="stylesheet" type="text/css" href="/Files/Templates/Designs/Swift/Assets/css/swiffy-slider.min.css"></link>