4-6 November 2025 in Poznan, Poland
Directions EMEA 2025
Join us for Directions EMEA 2025 - experience the latest updates from Microsoft and the ecosystem while connecting with the entire Business Central 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_Sessions_Info.cshtml" System.NullReferenceException: Object reference not set to an instance of an object. at CompiledRazorTemplates.Dynamic.RazorEngine_2204290742cb48d19734afcc1d03c483.<>c__DisplayClass14_7.<Execute>b__10(Speaker speaker) in C:\inetpub\wwwroot\directions2023\Files\Templates\Designs\Swift\Paragraph\COMM_Sessions_Info.cshtml:line 261 at System.Linq.Enumerable.WhereListIterator`1.MoveNext() at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) at CompiledRazorTemplates.Dynamic.RazorEngine_2204290742cb48d19734afcc1d03c483.Execute() in C:\inetpub\wwwroot\directions2023\Files\Templates\Designs\Swift\Paragraph\COMM_Sessions_Info.cshtml:line 261 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> 2 @using Dynamicweb.Frontend.Navigation 3 @using Dynamicweb.Content.Items 4 @using Dynamicweb.Frontend 5 @using System.Web.Helpers 6 @using System.Web 7 @using System.Text 8 @using System.Net 9 @using System.Linq 10 @using System 11 @using System.Globalization 12 @using Newtonsoft.Json 13 @using Newtonsoft.Json.Linq 14 15 @functions{ 16 17 public bool IsValidUrl(string url) 18 { 19 if (string.IsNullOrWhiteSpace(url)) return false; 20 return Uri.TryCreate(url, UriKind.Absolute, out Uri uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps); 21 } 22 23 static string GetJson(string address) 24 { 25 using (var client = new WebClient()) 26 { 27 client.Headers.Add("Content-Type", "application/json"); 28 try { 29 return client.DownloadString(address); 30 } catch (InvalidCastException e) 31 { 32 return ""; 33 } 34 } 35 } 36 37 38 string makeStringReadable(string data){ 39 string response = ""; 40 if(!string.IsNullOrEmpty(data)) 41 { 42 string myStr = data; 43 myStr = myStr.Replace('’', '\'').Replace('‘', '\'').Replace('–','-'); 44 byte[] bytes = Encoding.UTF8.GetBytes(myStr); 45 response = Encoding.UTF8.GetString(bytes); 46 response = response.Replace("\r\n", "<br>"); 47 response = response.Replace("’", "'"); 48 response = response.Replace("–","-"); 49 } 50 return response; 51 } 52 53 54 55 public class Root 56 { 57 public List<Session> sessions {get; set;} 58 public List<Speaker> speakers {get; set;} 59 //public List<Question> questions {get; set;} 60 public List<Category> categories {get; set;} 61 public List<Item> rooms {get; set;} 62 } 63 64 public class Session 65 { 66 public string id {get; set;} 67 public string title {get; set;} 68 public string description {get; set;} 69 public DateTime? startsAt {get; set;} 70 public DateTime? endsAt {get; set;} 71 public bool isServiceSession {get; set;} 72 public bool isPlenumSession {get; set;} 73 public List<string> speakers {get; set;} 74 public List<int> categoryItems {get; set;} 75 public List<QuestionAnswers> questionAnswers {get; set;} 76 public int? roomId {get; set;} 77 public string room {get; set;} 78 public string liveUrl {get; set;} 79 public string recordingUrl {get; set;} 80 public string status {get; set;} 81 } 82 83 public class Speaker 84 { 85 public string id {get; set;} 86 public string firstName {get; set;} 87 public string lastName {get; set;} 88 public string bio {get; set;} 89 public string tagLine {get; set;} 90 public string profilePicture {get; set;} 91 public bool isTopSpeaker {get; set;} 92 public List<Link> links {get; set;} 93 public List<string> sessions {get; set;} 94 public string fullName {get; set;} 95 public List<int> categoryItems {get; set;} 96 public List<QuestionAnswers> questionAnswers {get; set;} 97 } 98 99 public class Category 100 { 101 public int id {get; set;} 102 public string title {get; set;} 103 public List<Item> items {get; set;} 104 public int sort {get; set;} 105 public string type {get; set;} 106 } 107 108 public class Link 109 { 110 public string title {get; set;} 111 public string url {get; set;} 112 public string linType {get; set;} 113 } 114 115 public class Item 116 { 117 public int id {get; set;} 118 public string name {get; set;} 119 public int sort {get; set;} 120 } 121 122 public class Attribute 123 { 124 public string categoryTitle {get; set;} 125 public int categoryId {get; set;} 126 public int categorySort {get; set;} 127 public int attributeId {get; set;} 128 public string attributeName {get; set;} 129 public int attributeSort {get; set;} 130 } 131 132 public class QuestionAnswers 133 { 134 public string questionId {get; set;} 135 public string answerValue {get; set;} 136 } 137 138 public class Test 139 { 140 public List<QuestionAnswers> questionAnswers { get; set; } 141 } 142 } 143 144 @{ 145 var parentPages = Dynamicweb.Content.Services.Pages.GetAncestors(Pageview.Page.ID, true); 146 Dynamicweb.Content.Page rootPage = parentPages.Any() ? parentPages.Where(x => x.ItemType == "COMM_EventSection").FirstOrDefault() : new Dynamicweb.Content.Page(); 147 var item = Dynamicweb.Content.Services.Items.GetItem(rootPage.ItemType, rootPage.ItemId); 148 var sessionizeCode = item?["SessionizeCode"].ToString() ?? ""; 149 var eventCode = !string.IsNullOrEmpty(Model.Item?.GetString("SessionizeCode")) ? Model.Item?.GetString("SessionizeCode") : sessionizeCode; 150 var title = Model.Item?.GetString("Title"); 151 string theme = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("Theme")) && Model.Item.GetRawValueString("Theme") != "no-theme" ? " theme " + Model.Item.GetRawValueString("Theme").Replace(" ", "").Trim().ToLower() : ""; 152 string detailTheme = !string.IsNullOrWhiteSpace(Model.Item.GetRawValueString("DetailTheme")) && Model.Item.GetRawValueString("DetailTheme") != "no-theme" ? " theme " + Model.Item.GetRawValueString("DetailTheme").Replace(" ", "").Trim().ToLower() : ""; 153 detailTheme = detailTheme != "" ? detailTheme : theme; 154 string parentContainerCss = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString["session"]) ? "" : "shadow rounded-7"; 155 string sessionQueryParameter = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString["session"]) ? 156 Dynamicweb.Context.Current.Request.QueryString["session"] : string.Empty; 157 string sessionDetailCss = !string.IsNullOrEmpty(sessionQueryParameter) ? "p-4 rounded-7" : string.Empty; 158 159 theme = sessionQueryParameter != "" ? detailTheme : theme; 160 161 string display = Model.Item?.GetString("Display") ?? "g-col-12"; 162 } 163 164 <div class="h-100 @parentContainerCss @(theme) @sessionDetailCss item_@Model.Item.SystemName.ToLower()"> 165 @if (!string.IsNullOrEmpty(eventCode)) 166 { 167 string sessionizeAll = "https://sessionize.com/api/v2/" + eventCode + "/view/All"; 168 string responseSessionizeAll = GetJson(sessionizeAll).ToString(); 169 //responseSessionizeAll = makeStringReadable(responseSessionizeAll); 170 Root responseResult = Newtonsoft.Json.JsonConvert.DeserializeObject<Root>(responseSessionizeAll); 171 172 173 var sessionizeSessions = responseResult.sessions; 174 //filter out service sessions 175 sessionizeSessions = sessionizeSessions.Where(x=> !x.isServiceSession).ToList(); 176 177 var sessionizeCategories = responseResult.categories; 178 //filter categories 179 sessionizeCategories = sessionizeCategories.Any() ? sessionizeCategories.Where(x => (x.id != 34553) && (x.id != 34539)).ToList() :sessionizeCategories; 180 var sessionizeSpeakers = responseResult.speakers; 181 182 183 List<Attribute> sessionizeAttributes = new List<Attribute>(); 184 var filteredAttributes = new string []{"Product Category"}; 185 List<string> filteredAttributesId = new List<string>{"35602","186478","186480","186481"}; 186 List<string> filteredAttributesNames = new List<string>{"No","Yes"}; 187 foreach(var category in sessionizeCategories) 188 { 189 foreach(var i in category.items) 190 { 191 if(!filteredAttributesNames.Contains(i.name)) 192 { 193 Attribute attribute = new Attribute(); 194 attribute.categoryTitle = category.title; 195 attribute.categoryId = category.id; 196 attribute.categorySort = category.sort; 197 attribute.attributeId = i.id; 198 attribute.attributeName = i.name; 199 attribute.attributeSort = i.sort; 200 sessionizeAttributes.Add(attribute); 201 } 202 } 203 } 204 205 string sessionDetailLink = Dynamicweb.Context.Current.Request.RawUrl; 206 //var filtersList = new string []{"CONTENT OWNER","PRODUCT","LEVEL","SESSION TYPE","TARGET AUDIENCE","LEARNING PATH"}; 207 var filtersList = new string []{"SESSION TYPE","TARGET AUDIENCE","PRODUCT"}; 208 209 string categoriesQueryParameter = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString["categories"]) ? 210 Dynamicweb.Context.Current.Request.QueryString["categories"] : string.Empty; 211 string speakerQueryParameter = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString["speaker"]) ? 212 Dynamicweb.Context.Current.Request.QueryString["speaker"] : string.Empty; 213 214 List<Session> sessions = new List<Session>(); 215 List<int> categoryFilters = null; 216 if (!string.IsNullOrEmpty(categoriesQueryParameter)) 217 { 218 categoryFilters = categoriesQueryParameter?.Split(',')?.Select(Int32.Parse)?.ToList(); 219 } 220 221 foreach (var session in sessionizeSessions) 222 { 223 if (categoryFilters != null && categoryFilters.Any()) 224 { 225 if (categoryFilters.All(filter => session.categoryItems.Contains(filter))) 226 { 227 sessions.Add(session); 228 } 229 } 230 else 231 { 232 sessions.Add(session); 233 } 234 } 235 236 if (!string.IsNullOrEmpty(speakerQueryParameter)) 237 { 238 if (speakerQueryParameter.Contains(",")) 239 { 240 var querySpeakers = speakerQueryParameter?.Split(',').ToList(); 241 sessions = sessions.Where(session => querySpeakers.Any(s => session.speakers.Contains(s))).ToList(); 242 } 243 else 244 { 245 sessions = sessions.Where(session => session.speakers.Contains(speakerQueryParameter)).ToList(); 246 } 247 } 248 249 @* Filter current selected day sessions based on categories *@ 250 if (!string.IsNullOrEmpty(categoriesQueryParameter) && categoriesQueryParameter.Contains(",")) 251 { 252 253 var categories = categoriesQueryParameter?.Split(',')?.Select(Int32.Parse)?.ToList(); 254 sessionizeSessions = sessionizeSessions.Where(session => categories.Any(cat => session.categoryItems.Contains(cat))).ToList(); 255 } 256 257 @* Session details page logic *@ 258 if (!string.IsNullOrEmpty(sessionQueryParameter)) 259 { 260 var session = sessionizeSessions.Where(session => session.id == sessionQueryParameter).FirstOrDefault(); 261 var speakers = sessionizeSpeakers.Where(speaker => session.speakers.Contains(speaker.id)).ToList(); 262 var sessionTitle = makeStringReadable(!string.IsNullOrEmpty(session.title) ? session.title : "TBD"); 263 var sessionDescription = session.description != null ? makeStringReadable(session.description) : ""; 264 var currentPageUrl = Dynamicweb.Context.Current.Request.RawUrl.Split('?')[0]; 265 var clearFiltersUrl = currentPageUrl + "?session=" + session.id; 266 var seeScheduleUrl = currentPageUrl; 267 268 string requestTypeParam = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString["RequestType"]) ? 269 "&RequestType=" + Dynamicweb.Context.Current.Request.QueryString["RequestType"] : ""; 270 string layoutTemplate = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString["LayoutTemplate"]) ? 271 "&LayoutTemplate=" + Dynamicweb.Context.Current.Request.QueryString["LayoutTemplate"] : ""; 272 273 seeScheduleUrl = seeScheduleUrl + requestTypeParam; 274 seeScheduleUrl = seeScheduleUrl + layoutTemplate; 275 276 bool renderPresentationContainer = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString["RequestType"]) && Dynamicweb.Context.Current.Request.QueryString["RequestType"] == "External"; 277 278 string recordingUrl = session.recordingUrl; 279 string liveUrl = session.liveUrl; 280 281 <div class="grid w-100"> 282 <div class="g-col-lg-6 g-col-12 mb-3"> 283 <h1 class="mb-3">@sessionTitle</h1> 284 285 <div class="d-flex align-items-center gap-lg-4 gap-2 flex-wrap"> 286 <span> 287 <a class="btn btn-secondary" href="@seeScheduleUrl">@RenderIcon("/Files/Templates/Designs/Swift/Assets/icons/calendar.svg") @Translate("Back to event schedule")</a> 288 </span> 289 </div> 290 291 @if (renderPresentationContainer) 292 { 293 string sessionsUrl = "https://sessionize.com/api/v2/"+ eventCode + "/view/Sessions"; 294 string response = GetJson(sessionsUrl).ToString(); 295 296 JArray data = JArray.Parse(response); 297 JObject[] currentSession = data[0]["sessions"].Where(o => (string)o["id"] == session.id).Select(o => (JObject)o).ToArray(); 298 JArray questionsAndAnswers = currentSession[0]["questionAnswers"] != null ? 299 (JArray)currentSession[0]["questionAnswers"] : null; 300 301 <div class="presentation-container mt-3"> 302 @if (questionsAndAnswers != null) 303 { 304 foreach (var element in questionsAndAnswers) 305 { 306 bool renderDownloadLink = element["answer"] != null && !string.IsNullOrEmpty(element["answer"].ToString()) && IsValidUrl(element["answer"].ToString()); 307 if (renderDownloadLink) 308 { 309 <a class="btn btn-primary" href="@element["answer"]">@Translate("Download presentation")</a> 310 } 311 } 312 } 313 </div> 314 } 315 </div> 316 <div class="g-col-lg-6 g-col-12 mb-3 pt-5"> 317 @if (sessionDescription != null) 318 { 319 <div> 320 <p>@sessionDescription</p> 321 </div> 322 } 323 </div> 324 325 @if (speakers.Any()) 326 { 327 int categoryParameter = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString["Category"]) ? 328 Convert.ToInt32(Dynamicweb.Context.Current.Request.QueryString["Category"]) : 0; 329 var groupedAttributes = sessionizeAttributes.GroupBy( 330 attr => attr.categoryTitle, 331 (key, g) => new { Title = key, Items = g.ToList() }); 332 speakers = categoryParameter != 0 ? speakers.Where(speaker => speaker.categoryItems.Contains(categoryParameter)).ToList() : speakers; 333 string headerTitle = Translate("Speakers") + ":"; 334 335 <div class="g-col-12"> 336 <div class="w-100"> 337 <h4 class="mb-4">@headerTitle</h4> 338 </div> 339 340 @* Speakers wall *@ 341 <div class="grid"> 342 @for (int i = 0; i < speakers.Count(); i++) 343 { 344 var columnSize = "grid g-col-12"; 345 346 string viewSpeakerInfoTranslate = Translate("View") + " " + speakers[i].fullName + " " + Translate("info"); 347 string speakerName = speakers[i].fullName != null ? speakers[i].fullName.ToString() : ""; 348 string speakerBio = speakers[i].bio != null ? speakers[i].bio.ToString() : ""; 349 string speakerTagLine = speakers[i].tagLine != null ? speakers[i].tagLine.ToString() : ""; 350 string speakerProfilePicture = speakers[i].profilePicture != null ? speakers[i].profilePicture.ToString() : ""; 351 string speakerCategories = speakers[i].categoryItems != null ? String.Join(",", speakers[i].categoryItems) : ""; 352 var speakerSession = sessions.Where(session => speakers[i].sessions.Contains(session.id)).FirstOrDefault(); 353 var speakerSessions = sessions.Where(session => speakers[i].sessions.Contains(session.id)).ToList(); 354 var sessionsTranslate = speakerSessions.Count() > 1 ? Translate("Sessions") : Translate("Session"); 355 356 <div class="speaker @theme @columnSize gap-0 position-relative rounded-7" data-categories="@speakerCategories"> 357 <div class="h-100 g-col-lg-7 g-col-12 order-last order-md-first max-h-45-em"> 358 <div class="h-100 py-4 max-h-30-em"> 359 <div> 360 <a href="#" class="btn btn-link p-0 text-decoration-none" title="@viewSpeakerInfoTranslate" onclick="event.preventDefault(); new bootstrap.Modal(document.getElementById('SpeakerModal_@i')).show()"> 361 <h4 class="text-start">@makeStringReadable(speakerName)</h4> 362 </a> 363 <p>@speakerTagLine</p> 364 </div> 365 <div class="d-flex flex-column gap-3 justify-content-between max-h-15-em overflow-auto"> 366 <p class="m-0 pb-4">@makeStringReadable(speakerBio)</p> 367 </div> 368 @if (speakers[i].links.Any()) 369 { 370 <div class="d-flex gap-3 align-items-end position-absolute top-100 mt-negative-3-em"> 371 @foreach (var link in speakers[i].links) 372 { 373 string icon = "/Files/Templates/Designs/Swift/Assets/icons/"; 374 375 if (link.url.Contains("twitter")) 376 { 377 icon += "twitter.svg"; 378 } 379 else if (link.url.Contains("linkedin")) 380 { 381 icon += "linkedin.svg"; 382 } 383 else 384 { 385 icon += "link.svg"; 386 } 387 388 <a href="@link.url" title="@link.title" target="_blank"> 389 @RenderIcon(icon) 390 </a> 391 } 392 </div> 393 } 394 </div> 395 </div> 396 <div class="h-100 ratio g-col-lg-5 g-col-12 rounded-7" style="--bs-aspect-ratio: 100%;"> 397 <a class="btn btn-link p-4" title="@viewSpeakerInfoTranslate" onclick="new bootstrap.Modal(document.getElementById('SpeakerModal_@i')).show()"> 398 <img src="@speakerProfilePicture" class="w-100 h-100 rounded-7"></img> 399 </a> 400 </div> 401 <div class="h-100 w-100 position-absolute cursor-pointer d-none"> 402 <a class="btn btn-link stretched-link" title="@viewSpeakerInfoTranslate" onclick="new bootstrap.Modal(document.getElementById('SpeakerModal_@i')).show()"></a> 403 </div> 404 </div> 405 406 <div class="modal fade modal-xl" id="SpeakerModal_@i"> 407 <div class="modal-dialog"> 408 <div class="modal-content @theme rounded-7"> 409 <div class="modal-body p-0" id="SpeakerModalBodyContainer_@i"> 410 <div class="close-container position-absolute p-3 end-0 m-3 bg-white rounded-7 z-index-9"> 411 <button type="button" class="btn-close bg-dark z-index-9" data-bs-dismiss="modal" aria-label="Close"></button> 412 </div> 413 <div class="grid @theme gap-0 rounded-7"> 414 <div class="h-100 g-col-lg-7 g-col-12 order-last order-md-first"> 415 <div class="h-100 p-4 overflow-auto max-h-30-em"> 416 <div> 417 <h4>@makeStringReadable(speakerName)</h4> 418 <p>@speakerTagLine</p> 419 </div> 420 <div class="d-flex flex-column gap-3 justify-content-between"> 421 <p class="m-0">@makeStringReadable(speakerBio)</p> 422 </div> 423 <div class="mt-4 d-grid"> 424 <p class="m-0 fw-bold">@sessionsTranslate</p> 425 @foreach (var _item in speakerSessions) 426 { 427 var sessionLink = currentPageUrl.IndexOf("?") > 0 ? currentPageUrl + "&session=" + _item.id : currentPageUrl + "?session=" + _item.id; 428 <a class="btn btn-link text-start p-0 mb-2" title="@makeStringReadable(_item.title)" href="@sessionLink"> 429 @makeStringReadable(_item.title) 430 </a> 431 } 432 </div> 433 @if (speakers[i].links.Any()) 434 { 435 <div class="d-flex gap-3 align-items-end"> 436 @foreach (var link in speakers[i].links) 437 { 438 string icon = "/Files/Templates/Designs/Swift/Assets/icons/"; 439 440 if (link.url.Contains("twitter")) 441 { 442 icon += "twitter.svg"; 443 } 444 else if (link.url.Contains("linkedin")) 445 { 446 icon += "linkedin.svg"; 447 } 448 else 449 { 450 icon += "link.svg"; 451 } 452 453 <a href="@link.url" title="@link.title" target="_blank"> 454 @RenderIcon(icon) 455 </a> 456 } 457 </div> 458 } 459 </div> 460 </div> 461 <div class="h-100 ratio g-col-lg-5 g-col-12" style="--bs-aspect-ratio: 100%"> 462 <img src="@speakerProfilePicture" class="rounded-7"></img> 463 </div> 464 </div> 465 </div> 466 </div> 467 </div> 468 </div> 469 470 } 471 </div> 472 </div> 473 } 474 </div> 475 } 476 else 477 { 478 <div class="tab-content days-tabs-container p-lg-4 p-2 rounded-7"> 479 @{ 480 var attributesFiltered = sessionizeAttributes.Where(item => filtersList.Contains(item.categoryTitle.ToUpper())).ToList(); 481 var attributesCategories = attributesFiltered.Select(item => item.categoryTitle).Distinct(); 482 483 <div> 484 @if(attributesFiltered.Any()) 485 { 486 <div class="grid"> 487 @foreach(var filterCategory in attributesCategories) 488 { 489 string filterCategoryName = filterCategory; 490 string filterLabel = Translate("Filter " + filterCategoryName); 491 filterCategoryName = filterCategoryName.Replace(" ","-").ToLower(); 492 var dayAttributesList = attributesFiltered.OrderBy(item=>item.attributeName).Where(item=>item.categoryTitle == filterCategory).ToList(); 493 <div class="g-col-lg-3 g-col-12"> 494 <label class="fw-bold" for="filter-@filterCategoryName">@filterLabel</label> 495 <select id="filter-@filterCategoryName" name="filter-@filterCategoryName" class="filter-dropdown form-control select2-multiple filter-@filterCategoryName-ref filter-@filterCategoryName-trigger" multiple="multiple" data-date="" data-query-param="categories"> 496 @foreach (var category in dayAttributesList) 497 { 498 499 var categories = !string.IsNullOrEmpty(categoriesQueryParameter) ? categoriesQueryParameter?.Split(',')?.Select(Int32.Parse)?.ToList() : null; 500 var selected = !string.IsNullOrEmpty(categoriesQueryParameter) && categories.Contains(category.attributeId) ? "selected" : ""; 501 <option @selected value='@category.attributeId'>@category.attributeName</option> 502 } 503 </select> 504 @if (!string.IsNullOrEmpty(categoriesQueryParameter)) 505 { 506 var clearFiltersUrl = Dynamicweb.Context.Current.Request.RawUrl.Split('?')[0]; 507 @* include RequestType & LayoutTemplate params if present (embedded page scenario) *@ 508 string requestTypeParam = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString["RequestType"]) ? 509 "&RequestType=" + Dynamicweb.Context.Current.Request.QueryString["RequestType"] : ""; 510 string layoutTemplate = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString["LayoutTemplate"]) ? 511 "&LayoutTemplate=" + Dynamicweb.Context.Current.Request.QueryString["LayoutTemplate"] : ""; 512 513 clearFiltersUrl = clearFiltersUrl + requestTypeParam; 514 clearFiltersUrl = clearFiltersUrl + layoutTemplate; 515 <a class="btn btn-link clear-filters" href="@clearFiltersUrl" title="Clear filters" data-target-dropdown="filter-@filterCategoryName"> 516 @Translate("Clear filters") 517 </a> 518 } 519 </div> 520 521 } 522 <div class="g-col-lg-3 g-col-12"> 523 <label class="fw-bold" for="filter-speaker">Filter Speaker</label> 524 <select id="filter-speaker" name="filter-speaker" class="filter-dropdown form-control select2-multiple filter-speaker-ref filter-speaker-trigger" multiple="multiple" data-date="" data-query-param="speaker"> 525 @foreach (var filterSpeaker in sessionizeSpeakers) 526 { 527 var selected = ""; 528 if (!string.IsNullOrEmpty(speakerQueryParameter)) 529 { 530 if (speakerQueryParameter.Contains(",")) 531 { 532 var querySpeakers = speakerQueryParameter?.Split(',').ToList(); 533 selected = querySpeakers.Contains(filterSpeaker.id) ? "selected" : ""; 534 } 535 else 536 { 537 selected = filterSpeaker.id == speakerQueryParameter ? "selected" : ""; 538 } 539 } 540 <option @selected value='@filterSpeaker.id'>@makeStringReadable(filterSpeaker.fullName)</option> 541 } 542 </select> 543 @if (!string.IsNullOrEmpty(speakerQueryParameter)) 544 { 545 var clearFiltersUrl = Dynamicweb.Context.Current.Request.RawUrl.Split('?')[0]; 546 @* include RequestType & LayoutTemplate params if present (embedded page scenario) *@ 547 string requestTypeParam = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString["RequestType"]) ? 548 "&RequestType=" + Dynamicweb.Context.Current.Request.QueryString["RequestType"] : ""; 549 string layoutTemplate = !string.IsNullOrEmpty(Dynamicweb.Context.Current.Request.QueryString["LayoutTemplate"]) ? 550 "&LayoutTemplate=" + Dynamicweb.Context.Current.Request.QueryString["LayoutTemplate"] : ""; 551 552 clearFiltersUrl = clearFiltersUrl + requestTypeParam; 553 clearFiltersUrl = clearFiltersUrl + layoutTemplate; 554 <a class="btn btn-link clear-speaker-filters" href="@clearFiltersUrl" title="Clear filters" data-target-dropdown="filter-speaker"> 555 @Translate("Clear filters") 556 </a> 557 } 558 </div> 559 </div> 560 } 561 <div class="hidden"> 562 <div class="filterData"> 563 @foreach (var filter in filtersList) 564 { 565 string filterName = filter; 566 } 567 </div> 568 </div> 569 570 <!--FiltersEnd--> 571 572 573 <!-- Second level content start --> 574 <div class="tab-content2 tab-content-schedule"> 575 <!-- All sessions start --> 576 <div class="tab-pane fade-in"> 577 <div class="panel-group mt-4"> 578 <p class="not-found mb-0 d-none">@Translate("No items found.")</p> 579 @{ 580 581 if (sessions.Any()) 582 { 583 string breakSessionTheme = sessions.Any(session => session.isServiceSession) ? "theme ice-blue" : ""; 584 string isBreakSession = sessions.Any(session => session.isServiceSession) ? "is-break" : ""; 585 586 <div class="grid gap-lg-4 panel schedule-item border p-4 mb-3 position-relative rounded-7 grid-auto-rows-1-fr @isBreakSession" data-duration="" data-status=""> 587 @foreach (var session in sessions) 588 { 589 var speakers = sessionizeSpeakers.Where(speaker => session.speakers.Contains(speaker.id)).ToList(); 590 var isBreak = session.isServiceSession ? "full" : ""; 591 var test = session.isServiceSession ? "tested" : ""; // Check data structure here 592 var publishingStatus = "FULL"; 593 var approvalStatus = "approved"; 594 var categoriesList = session.categoryItems; 595 var _categories = String.Join(",", categoriesList.ToArray()); 596 string categories = ""; 597 598 var attributes = sessionizeAttributes.Where(item => categoriesList.Any(category => category == item.attributeId)); 599 string sessionDetailLinkAdjusted = sessionDetailLink.IndexOf("?") > 0 ? sessionDetailLink + "&session=" + session.id : sessionDetailLink + "?session=" + session.id; 600 string sessionTitle = makeStringReadable(!string.IsNullOrEmpty(session.title) ? session.title : "TBD"); 601 string columnCss = sessions.Count() == 1 ? "g-col-12" : "g-col-lg-6 g-col-12"; 602 columnCss = display; 603 <div class="d-grid- gap-3- @columnCss title border-bottom my-3 pb-3 @test"> 604 <div class="session-name" data-publishing="@publishingStatus" data-categories="@_categories" data-approval="@approvalStatus" data-code="@session.id"> 605 @if (publishingStatus == "FULL" && isBreak == "") 606 { 607 <a class="text-decoration-none fw-bold" href='@sessionDetailLinkAdjusted' data-id="@session.id"><h5 class="session-header">@sessionTitle</h5></a> 608 } 609 else 610 { 611 <h5 class="session-header fw-bold">@sessionTitle</h5> 612 } 613 </div> 614 @if (speakers.Any()) 615 { 616 <div> 617 <div class="d-flex flex-wrap gap-2"> 618 <span class="fw-bold mb-2 tags-text">@Translate("Speakers")</span> 619 <span class="speaker-name"> 620 @foreach(var speaker in speakers) 621 { 622 string viewSpeakerInfoTranslate = Translate("View") + " " + speaker.fullName + " " + Translate("info"); 623 <a href="#" class="btn btn-link p-0 text-decoration-none" title="@viewSpeakerInfoTranslate" onclick="event.preventDefault(); new bootstrap.Modal(document.getElementById('SpeakerModal_@speaker.id')).show()"> 624 <span class="text-start text-decoration-underline">@makeStringReadable(speaker.fullName)</span> 625 </a> 626 } 627 </span> 628 </div> 629 </div> 630 } 631 @if (attributes.Any()) 632 { 633 <div> 634 <div class="d-flex flex-wrap gap-2"> 635 <span class="fw-bold mb-2 tags-text">@Translate("Tags")</span> 636 @foreach (var attr in attributes) 637 { 638 <a class="session-tags text-decoration-underline fs-7" href="#" data-target="filter-sessions" id="@attr.attributeId">@attr.attributeName</a> 639 } 640 </div> 641 </div> 642 } 643 644 </div> 645 } 646 </div> 647 } 648 else 649 { 650 <div class="grid gap-lg-4 panel schedule-item border p-4 mb-3 position-relative rounded-7 grid-auto-rows-1-fr"> 651 @Translate("No results") 652 </div> 653 } 654 655 } 656 </div> 657 </div> 658 </div> 659 @if(sessionizeSpeakers.Any()) 660 { 661 foreach(var sessionizeSpeaker in sessionizeSpeakers) 662 { 663 string id = sessionizeSpeaker.id; 664 string speakerName = sessionizeSpeaker.fullName; 665 string speakerBio = sessionizeSpeaker.bio; 666 var speakerLinks = sessionizeSpeaker.links; 667 string speakerProfilePicture = sessionizeSpeaker.profilePicture; 668 string speakerTagLine = sessionizeSpeaker.tagLine; 669 <div class="modal fade modal-xl" id="SpeakerModal_@id"> 670 <div class="modal-dialog"> 671 <div class="modal-content @theme rounded-7"> 672 <div class="modal-body p-0" id="SpeakerModalBodyContainer_@id"> 673 <div class="close-container position-absolute p-3 end-0 m-3 bg-white rounded-7 z-index-9"> 674 <button type="button" class="btn-close bg-dark z-index-9" data-bs-dismiss="modal" aria-label="Close"></button> 675 </div> 676 <div class="grid @theme gap-0 rounded-7"> 677 <div class="h-100 g-col-lg-7 g-col-12 order-last order-md-first"> 678 <div class="h-100 p-4 overflow-auto max-h-30-em"> 679 <div> 680 <h4>@makeStringReadable(speakerName)</h4> 681 <p>@speakerTagLine</p> 682 </div> 683 <div class="d-flex flex-column gap-3 justify-content-between"> 684 <p class="m-0">@makeStringReadable(speakerBio) @speakerBio</p> 685 </div> 686 @*<div class="mt-4 d-grid"> 687 <p class="m-0 fw-bold">sessionsTranslate</p> 688 foreach (var _item in speakerSessions) 689 { 690 var sessionLink = currentPageUrl.IndexOf("?") > 0 ? currentPageUrl + "&session=" + _item.id : currentPageUrl + "?session=" + _item.id; 691 <a class="btn btn-link text-start p-0 mb-2" title="@_item.title" href="@sessionLink"> 692 @_item.title 693 </a> 694 } 695 </div>*@ 696 @if (speakerLinks.Any()) 697 { 698 <div class="d-flex gap-3 align-items-end"> 699 @foreach (var link in speakerLinks) 700 { 701 string icon = "/Files/Templates/Designs/Swift/Assets/icons/"; 702 703 if (link.url.Contains("twitter")) 704 { 705 icon += "twitter.svg"; 706 } 707 else if (link.url.Contains("linkedin")) 708 { 709 icon += "linkedin.svg"; 710 } 711 else 712 { 713 icon += "link.svg"; 714 } 715 716 <a href="@link.url" title="@link.title" target="_blank"> 717 @RenderIcon(icon) 718 </a> 719 } 720 </div> 721 } 722 </div> 723 </div> 724 <div class="h-100 ratio g-col-lg-5 g-col-12" style="--bs-aspect-ratio: 100%"> 725 <img src="@speakerProfilePicture" class="rounded-7"></img> 726 </div> 727 </div> 728 </div> 729 </div> 730 </div> 731 </div> 732 } 733 } 734 </div> 735 } 736 </div> 737 } 738 } 739 740 </div> 741 742 743 @helper RenderIcon(string icon) 744 { 745 if (System.IO.Path.GetExtension(icon).ToLower() == ".svg") 746 { 747 if (!icon.ToLower().Contains("none") && icon != string.Empty) 748 { 749 <span class="icon-auto"> 750 @ReadFile(icon) 751 </span> 752 } 753 } 754 } 755 <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" /> 756 <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>