@@ -371,25 +371,29 @@ body {
371
371
<span class="expand-icon">▼</span>
372
372
</div>
373
373
<div class="schedule-day-content">
374
- {% for session in day.sessions %}
375
- <div class="schedule-session">
376
- <p class="schedule-time">{{ session.time }}</p>
377
- <h6>{{ session.title }}</h6>
378
- {% for item in session.items %}
379
- <p>
380
- {% assign processed_item = item %}
381
- {% for speaker in site.data.winter_school_speakers %}
382
- {% assign speaker_name = speaker.name | remove: "Prof. Dr. " %}
383
- {% if item contains speaker_name %}
384
- {% assign processed_item = processed_item | replace: speaker_name, '<a href="javascript:void(0)" class="speaker-link" data-speaker-id="' | append: forloop.index | append: '">' | append: speaker_name | append: '</a>' %}
385
- {% endif %}
386
- {% endfor %}
387
- {{ processed_item }}
388
- </p>
389
- {% endfor %}
390
- </div>
374
+ {% for session in day.sessions %}
375
+ <div class="schedule-session">
376
+ <p class="schedule-time">{{ session.time }}</p>
377
+ <h6>{{ session.title }}</h6>
378
+ {% for item in session.items %}
379
+ <p>
380
+ {% assign processed_item = item %}
381
+ {% for speaker in site.data.winter_school_speakers %}
382
+ {% assign speaker_full_name = speaker.name %}
383
+ {% assign speaker_short_name = speaker.name | remove: "Prof. Dr. " %}
384
+ {% if item contains speaker_full_name or item contains speaker_short_name %}
385
+ {% capture speaker_link %}
386
+ <a class="speaker-link" onclick="showSpeakerDetails('{{ forloop.index }}')" href="#">{{ speaker_short_name }}</a>
387
+ {% endcapture %}
388
+ {% assign processed_item = processed_item | replace: speaker_full_name, speaker_link | replace: speaker_short_name, speaker_link %}
389
+ {% endif %}
391
390
{% endfor %}
392
- </div>
391
+ {{ processed_item }}
392
+ </p>
393
+ {% endfor %}
394
+ </div>
395
+ {% endfor %}
396
+ </div >
393
397
</div>
394
398
{% endfor %}
395
399
</section >
@@ -398,46 +402,84 @@ body {
398
402
</div>
399
403
</div >
400
404
<br >
401
-
402
405
<script >
403
406
document .addEventListener (' DOMContentLoaded' , function () {
404
- // Schedule day toggle functionality
407
+ // Schedule day toggles
405
408
const dayHeaders = document .querySelectorAll (' .schedule-day-header' );
406
409
dayHeaders .forEach (header => {
407
- header .addEventListener (' click' , function () {
410
+ header .addEventListener (' click' , function (e ) {
411
+ e .preventDefault ();
408
412
this .classList .toggle (' active' );
409
413
const content = this .nextElementSibling ;
410
- content .classList .toggle (' show' );
411
- const icon = this .querySelector (' .expand-icon' );
412
- icon .textContent = icon .textContent === ' ▼' ? ' ▲' : ' ▼' ;
414
+ if (content) {
415
+ content .classList .toggle (' show' );
416
+ const icon = this .querySelector (' .expand-icon' );
417
+ if (icon) {
418
+ icon .textContent = icon .textContent === ' ▼' ? ' ▲' : ' ▼' ;
419
+ }
420
+ }
413
421
});
414
422
});
415
423
416
- // Speaker link functionality
417
- const speakerLinks = document .querySelectorAll (' .speaker-link ' );
418
- speakerLinks . forEach ( link => {
419
- link .addEventListener (' click' , function (e ) {
424
+ // Speaker cards click handling
425
+ document .querySelectorAll (' .custom-card ' ). forEach (( card , index ) => {
426
+ card . setAttribute ( ' data-speaker-id ' , index + 1 );
427
+ card .addEventListener (' click' , (e ) => {
420
428
e .preventDefault ();
421
- const speakerId = this .getAttribute (' data-speaker-id' );
422
-
423
- // Reset all cards and details
424
- document .querySelectorAll (' .custom-card' ).forEach (card => {
425
- card .classList .remove (' active' );
426
- });
427
- document .querySelectorAll (' .speaker-details' ).forEach (detail => {
428
- detail .classList .remove (' show' );
429
- });
430
-
431
- // Activate clicked speaker's card and details
432
- const speakerCard = document .querySelector (` .custom-card[data-speaker-id="${ speakerId} "]` );
433
- const speakerDetails = document .getElementById (` speaker-details-${ speakerId} ` );
434
-
435
- if (speakerCard && speakerDetails) {
436
- speakerCard .classList .add (' active' );
437
- speakerDetails .classList .add (' show' );
438
- speakerDetails .scrollIntoView ({ behavior: ' smooth' , block: ' nearest' });
439
- }
429
+ showSpeakerDetails (index + 1 );
440
430
});
441
431
});
432
+
433
+ // Speaker links in schedule
434
+ document .addEventListener (' click' , function (e ) {
435
+ if (e .target .classList .contains (' speaker-link' )) {
436
+ e .preventDefault ();
437
+ const speakerId = e .target .dataset .speakerId ;
438
+ if (speakerId) {
439
+ showSpeakerDetails (speakerId);
440
+ }
441
+ }
442
+ });
442
443
});
444
+
445
+ function showSpeakerDetails (speakerId ) {
446
+ try {
447
+ // Reset previous states
448
+ document .querySelectorAll (' .custom-card' ).forEach (card => {
449
+ card .classList .remove (' active' );
450
+ });
451
+ document .querySelectorAll (' .speaker-details' ).forEach (detail => {
452
+ detail .classList .remove (' show' );
453
+ });
454
+
455
+ // Activate selected speaker
456
+ const speakerCard = document .querySelector (` .custom-card[data-speaker-id="${ speakerId} "]` );
457
+ const speakerDetails = document .getElementById (` speaker-details-${ speakerId} ` );
458
+
459
+ if (! speakerCard || ! speakerDetails) {
460
+ console .error (' Speaker card or details not found' );
461
+ return ;
462
+ }
463
+
464
+ speakerCard .classList .add (' active' );
465
+ speakerDetails .classList .add (' show' );
466
+
467
+ // Scroll to speaker section with offset for fixed headers
468
+ const speakerSection = document .querySelector (' .speakers-section' );
469
+ if (speakerSection) {
470
+ const headerOffset = 100 ; // Adjust based on your header height
471
+ const elementPosition = speakerSection .getBoundingClientRect ().top ;
472
+ const offsetPosition = elementPosition + window .pageYOffset - headerOffset;
473
+
474
+ window .scrollTo ({
475
+ top: offsetPosition,
476
+ behavior: ' smooth'
477
+ });
478
+ }
479
+ } catch (error) {
480
+ console .error (' Error showing speaker details:' , error);
481
+ // Optional: Show user-friendly error message
482
+ alert (' Sorry, there was an error displaying the speaker details.' );
483
+ }
484
+ }
443
485
</script >
0 commit comments