7-9 May 2025
Directions ASIA 2025
Directions ASIA is expanding to a 3-day conference in 2025, with an even greater focus on learning and growth. Join us again in Bangkok, where you’ll enjoy exceptional hospitality and a culinary experience like no other, for the latest updates from Microsoft and the ecosystem. Connect with the entire Dynamics community, including resellers, add-on providers, Microsoft, CSPs, MVPs, developers, consultants, sales and marketing professionals and business leaders. Fuel your motivation, inspiration, and success through sharing and collaboration.
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>