| Page source: |
1: <script src="${website.cdn("/info/klass.min.js")}"></script>
2:
3: #set ($fromHeadlines = false)
4: #if ($request.getParameter("from_headlines") == true)
5: #set ($fromHeadlines = true)
6: #end
7:
8: ## PICK UP OPTIONS
9: $website.include("options")
10: #set ($options = $request.getAttribute("options"))
11: #set ($locale = "en_us")
12: #set ($locale = $options.get("locale"))
13:
14: ## HACK TO GET STATS URL FROM RENDERER... NEEDS SERVER CHANGE
15: #set ($bioObject = $page.getDataAsObject())
16: #set ($statsURL = $bioObject.statsURL)
17: #if ($statsURL.length() > 0)
18: $website.includeAgain("${statsURL}?tmpl=bio-stats-template")
19: ## various settings to get the variables set
20: #set ($events = $request.getAttribute("bio_events"))
21: #set ($seasons = $request.getAttribute("bio_seasons"))
22: #set ($career = $request.getAttribute("bio_career"))
23: #set ($labels = $request.getAttribute("bio_labels"))
24: #set ($briefs = $request.getAttribute("bio_briefs"))
25: #set ($gamelogs = $request.getAttribute("bio_gamelogs"))
26: #set ($splits = $request.getAttribute("bio_splits"))
27: #set ($statPosition = $request.getAttribute("bio_position"))
28: #set ($positions = $request.getAttribute("bio_positions"))
29: #set ($playerId = $request.getAttribute("bio_player_id"))
30: #set ($highlights = $request.getAttribute("bio_highlights"))
31: #set ($formats = $request.getAttribute("bio_formats"))
32: #set ($gamelogsCategoriesLabels = $request.getAttribute("bio_gamelogs_labels"))
33: #set ($briefsCategoriesLabels = $request.getAttribute("bio_briefs_labels"))
34: #set ($gamesResults = $request.getAttribute("bio_games_results"))
35: #set ($monthsPlayed = $request.getAttribute("bio_months_played"))
36: #set ($rosterTransactions = $request.getAttribute("roster_transactions"))
37: #end
38:
39: #set ($pos = "")
40: #if($attributes.get("position_stat"))
41: #set ($pos = $attributes.get("position_stat"))
42: #else
43: #set ($pos = $attributes.get("position"))
44: #set ($pos = $statPosition)
45: #set ($posVec = $pos.split("/"))
46: #set ($pos = $posVec[0])
47: #end
48: #set ($pos = $pos.toLowerCase())
49: #set ($statPos = $positions.get($pos))
50: #set ($paramPos = $request.getParameter("pos"))
51:
52: #set ($playerId = $attributes.get("playerId"))
53: #set ($stats = $splits.overall)
54: #set ($highlights = $highlights.get($statPos))
55:
56: #set ($showHighlights = true)
57: #if ($options.get("bio_show_highlights") && $options.get("bio_show_highlights") == false)
58: #set ($showHighlights = false)
59: #end
60:
61: #set ($enhancedLayout = false)
62: #if ($options.get("bio_enhanced_layout") == "yes" || $request.getParameter("bio_enhanced_layout") == true || $request.getAttribute("enhanced") == "true")
63: #set ($enhancedLayout = true)
64: #elseif($request.getParameter("bio_enhanced_layout") == false || $request.getAttribute("enhanced") == "false")
65: #set ($enhancedLayout = false)
66: #end
67:
68: #set ($showActionShots = true)
69: #if ($options.get("bio_show_action_shots") && $options.get("bio_show_action_shots") == false)
70: #set ($showActionShots = false)
71: #end
72:
73: #set ($showDate = true)
74: #if ($options.get("news_layout_show_date") == "no")
75: #set ($showDate = false)
76: #end
77:
78: #set ($showLeadin = true)
79: #if ($options.get("news_layout_show_leadin") == "no")
80: #set ($showLeadin = false)
81: #end
82:
83: #set ($dateFormat = "MMMM dd, yyyy")
84: #if ($options.get("site_date_format").length() > 0) #set ($dateFormat = $options.get("site_date_format")) #end
85:
86: #set ($thumbnail-orientation = "ratio ratio-16x9 ratio-adaptive")
87: #if ($options.get("news_thumbnail_orientation") == "portrait") ## default view from options
88: #set ($thumbnail-orientation = "ratio ratio-3x4")
89: #elseif ($options.get("news_thumbnail_orientation") == "landscape")
90: #set ($thumbnail-orientation = "ratio ratio-16x9")
91: #elseif ($options.get("news_thumbnail_orientation") == "adaptive")
92: #set ($thumbnail-orientation = "embed-responsive-adaptive")
93: #elseif ($request.getParameter("thumbnail_orientation") == "portrait") ## default view from include parameter
94: #set ($thumbnail-orientation = "ratio ratio-3x4")
95: #end
96:
97: #set ($showThumb = true)
98: #if ($options.get("news_layout_show_thumb") == "no")
99: #set ($showThumb = false)
100: #end
101: #set ($thumbWidth = 767)
102:
103: #set ($actionShotsLimit = 5)
104: #set ($actionShotsLimit = $tool.math.toInteger($options.get("bio_action_shots_limit")))
105:
106: #set ($showCareer = $wiki.valid() && $seasons)
107: #if ("yes" == $options.get("stats_show_career") && $seasons)
108: #set ($showCareer = true)
109: #end
110:
111: #set ($hasEvents = $events.size() > 0)
112: #set ($hasSynopsis = $synopsis.trim().length() > 0)
113: #set ($htmlStatsURL = "${page.url}-stats")
114: #set ($hasHTMLStats = $website.exists($htmlStatsURL))
115: #set ($bioBriefURL = "${page.url}-brief")
116: #set ($hasBioBrief = $website.exists("$bioBriefURL"))
117: #set ($showRoster = ($page.contentType == "loki/bio" && $page.headlinesFeatured.size() > 0) || ($page.contentType == "loki/bio-network" && $page.sectionPage.children.size() > 1))
118: #if ($options.get("bio_hide_roster") == true)
119: #set ($showRoster = false)
120: #end
121:
122: #if ($hasEvents)
123: $request.setAttribute("icl-dataTables-script", true)
124: #end
125:
126: #set ($view = "")
127: #if ($hasSynopsis || $hasBioBrief)
128: #set ($view = "bio")
129: #elseif ($statsURL.length() > 0)
130: #set ($view = "profile")
131: #elseif ($hasHTMLStats)
132: #set ($view = "htmlstats")
133: #elseif ($releases.size() > 0)
134: #set ($view = "news")
135: #elseif ($playerPhotos.size() > 0)
136: #set ($view = "photos")
137: #elseif ($playerVideos.size() > 0)
138: #set ($view = "videos")
139: #end
140:
141: #if ($options.get("bio_default_view").length() > 0)
142: #set ($checkView = $options.get("bio_default_view"))
143: #else
144: ## THIS ESTABLISHES A DEFAULT TAB FOR NEW BOOTSTRAP THEMES
145: #if ($hasSynopsis || $hasBioBrief)
146: #set ($checkView = "bio")
147: #elseif ($statsURL.length() > 0)
148: #set ($checkView = "profile")
149: #elseif ($releases.size() > 0)
150: #set ($checkView = "news")
151: #end
152: #end
153:
154: #if ($request.getParameter("view"))
155: #set ($checkView = $request.getParameter("view"))
156: #end
157:
158: #if ($checkView == "profile" && $statsURL.length() > 0)
159: #set ($view = "profile")
160: #elseif ($checkView == "bio" && ($hasSynopsis || $hasBioBrief))
161: #set ($view = "bio")
162: #elseif ($checkView == "gamelog" && $statsURL.length() > 0)
163: #set ($view = "gamelog")
164: #elseif ($checkView == "career" && $showCareer)
165: #set ($view = "career")
166: #elseif ($checkView == "splits" && $statsURL.length() > 0)
167: #set ($view = "splits")
168: #elseif ($checkView == "htmlstats" && $hasHTMLStats)
169: #set ($view = "htmlstats")
170: #elseif ($checkView == "news" && $releases.size() > 0)
171: #set ($view = "news")
172: #elseif ($checkView == "photos" && $playerPhotos.size() > 0)
173: #set ($view = "photos")
174: #elseif ($checkView == "videos" && $playerVideos.size() > 0)
175: #set ($view = "videos")
176: #elseif ($checkView == "weplayed")
177: #set ($view = "weplayed")
178: #end
179:
180: #***********************************************
181: # MACROS
182: # *********************************************#
183: #macro (capitalize $name)
184: $name.substring(0,1).toUpperCase()$name.substring(1).toLowerCase()
185: #end
186:
187: #macro (printTitle)
188: #set ($pageTitle = "Bio")
189: #if ($page.title.trim().length() > 0)
190: #set ($pageTitle = $page.title.trim())
191: #end
192:
193: #if ($fromHeadlines || !$website.isIncluded())
194: #if($request.getAttribute("pageTitle").length() > 0)
195: #set ($pageTitle = $request.getAttribute("pageTitle"))
196: #else
197: #set ($pageTitle = "")
198: #end
199: #if ($page.title.length() > 0)
200: #set ($pageTitle = $!page.title)
201: <h1 class="page-title d-none">$!pageTitle</h1>
202: #end
203: #if($pageTitle.trim().length() == 0)
204: #set ($pageTitle = "#capitalize($page.name.trim())")
205: #end
206: $!request.setAttribute("pageTitle", "${pageTitle}")
207:
208: #if ($body.length() > 150)
209: $!request.setAttribute("pageDescription", "$body.substring(1, 150) ...")
210: #else
211: $!request.setAttribute("pageDescription", "$body")
212: #end
213: #end
214: #end
215:
216: #macro (printLeadIn)
217: #if($page.leadIn.length() > 0 && ($fromHeadlines || !$website.isIncluded()))
218: <h2 class="page-sub-title fs-5 d-none">$page.leadIn</h2>
219: #end
220: #end
221:
222: #macro (printThumbnail)
223: #set ($thumbSrc = "$!{page.thumbnailURL}")
224: #set ($thumbAlt = "$!page.title")
225: #if ($page.thumbnailPage.altText.length() > 0)
226: #set ($thumbAlt = "$page.thumbnailPage.altText")
227: #end
228: #if($thumbSrc.length() > 0 )
229: <picture alt="$thumbAlt">
230: <source media="(min-width:1200px)" srcset="${thumbSrc}?max_width=1920">
231: <source media="(min-width:992px)" srcset="${thumbSrc}?max_width=1200">
232: <source media="(min-width:576px)" srcset="${thumbSrc}?max_width=992">
233: <source media="(min-width:0px)" srcset="${thumbSrc}?max_width=576">
234: <img class="img-fluid mx-auto" src="${thumbSrc}?max_width=1920" alt="${thumbAlt}"/>
235: </picture>
236: #end
237: #end
238:
239: #macro (printResultAriaLabel $event)
240: #set ($ariaLabel = "${event.sport} event: ${formatter.formatDate($event.date, 'MMMM d hh:mm a:')}")
241: #if ($event.neutralSite.length() > 0 || $event.home)
242: #set ($ariaLabel = "${ariaLabel} vs.")
243: #else
244: #set ($ariaLabel = "${ariaLabel} at")
245: #end
246: #set ($ariaLabel = "${ariaLabel} ${event.opponent.name}:")
247: #if ($event.neutralSite.length() > 0)
248: #set ($ariaLabel = "${ariaLabel} @ ${event.neutralSite}:")
249: #end
250: #set ($ariaLabel = "${ariaLabel} Box Score")
251: aria-label="$ariaLabel"
252: #end
253:
254: #macro(playIcon $url)
255: <a href="$url" class="play-btn video-btn-overlay" onclick="return(false);" onmouseup="return(false);">
256: <span class="center-icon-pre">
257: <span class="center-icon">
258: <span class="visually-hidden">Play Video</span>
259: <span class="fab fa-youtube"></span>
260: </span>
261: </span>
262: </a>
263: #end
264:
265: #macro (printVideo $article)
266: #if ($article.contentType == "loki/youtube")
267: #set ($videoID = $article.dataAsString)
268: <img src="https://i3.ytimg.com/vi/${videoID}/sddefault.jpg" onerror="this.onerror=null; this.src='https://i3.ytimg.com/vi/${videoID}/mqdefault.jpg';" alt="video thumbnail for $article.thumbnailAlt" class="card-img-top img-fluid" />
269: #playIcon($article.url)
270: #end
271:
272: #if ($article.contentType == "loki/video")
273: <video class="player" muted="true">
274: <source src="${article.url}?dec=" type="video/mp4" />
275: </video>
276: #playIcon($article.url)
277: #end
278: #end
279:
280: ## ARTICLE MENTIONS MACRO
281: #macro (printReleases $items $type)
282: <div class="news-releases news-layout grid bio-news-mentions">
283: <div class="cards">
284: #foreach ($article in $items)
285:
286: ## CATEGORY / TITLE
287: #set ($title = $article.title)
288: #set ($category = "Article")
289:
290: #if($article.contentType == "loki/bio")
291: #set ($category = "Bio")
292: #elseif ($article.contentType == "video/x-flv" || $article.contentType == "loki/video" || $article.contentType == "loki/youtube")
293: #set ($category = "Video")
294: #end
295:
296: #if ($article.url.startsWith("/sports/"))
297: #set ($sportKey = $article.url.split("/").get(2))
298: #if ($sportLabels.containsKey($sportKey))
299: #set ($category = $sportLabels.get($sportKey))
300: #end
301: #else
302: #set ($articleSection = $article.sectionPage)
303: #foreach ($i in [1..5])
304: #if ($articleSection.url.length() == 0)
305: #break
306: #elseif ($articleSection.sectionPage.url.length() == 0) ## if parent is a root section
307: #if ($articleSection.title.length() > 0)
308: #set ($category = $articleSection.title)
309: #else
310: #set ($firstChar = $articleSection.name.substring(0, 1).toUpperCase())
311: #set ($afterFirstChars = $articleSection.name.substring(1))
312: #set ($category = "${firstChar}${afterFirstChars}")
313: #end
314: #break
315: #end
316: #set ($articleSection = $articleSection.sectionPage)
317: #end
318: #end
319: ## END CATEGORY / TITLE
320:
321: #set ($altText = $article.title)
322: #if ($article.thumbnailURL)
323: #if ($article.thumbnailPage.altText.length() > 0)
324: #set ($altText = "$article.thumbnailPage.altText")
325: #end
326: #end
327:
328: #if ($article.thumbnailURL.length() > 0)
329: #set ($src = $article.thumbnailURL)
330: #elseif ($website.exists("/images/setup/default-thumbnail.png"))
331: #set ($src = "/images/setup/default-thumbnail.png")
332: #elseif ($website.exists("/images/setup/thumbnail_default.jpg"))
333: #set ($src = "/images/setup/thumbnail_default.jpg")
334: #else
335: #set ($src = "/info/images/default-thumbnail.png")
336: #end
337: #set ($thumbnailURL = "${src}?max_width=${thumbWidth}")
338:
339: #set ($cardClass = "card")
340: #if ($velocityCount > $showSize)
341: #set ($cardClass = "card hidden")
342: #end
343:
344: <div class="${cardClass} border position-relative">
345: <div class="card-inner position-relative">
346: #if ($showThumb == true)
347: <div class="thumb overflow-hidden card-img-top ${thumbnail-orientation}" style="background-image:url('${thumbnailURL}'); background-size:cover; background-position:center;">
348: <img src="${thumbnailURL}" alt="${altText}" class="img-fluid" />
349: #printVideo($article)
350: </div>
351: #end
352: <div class="card-body border-top rounded-bottom bg-white">
353: <div class="entry-body-header">
354: <ul class="entry-meta list-unstyled d-flex align-items-center justify-content-between mb-0 text-muted small">
355: <li class="entry-category">$category</li>
356: <li class="entry-header-date d-none d-lg-block hide-on-grid-view">
357: <span class="d-flex align-items-center">
358: <span class="fa-regular fa-calendar"></span>
359: <span class="ms-2">$formatter.formatDate($article.date, $dateFormat)</span>
360: </span>
361: </li>
362: </ul>
363: <div class="card-title entry-title fw-bold mb-0">
364: <a class="text-decoration-none stretched-link clamp-2" href="$article.url">$title</a>
365: </div>
366: #if ($showLeadin == true && $article.leadIn.length() > 0)
367: <p class="card-text entry-summary clamp-3">$article.leadIn</p>
368: #end
369: </div>
370: </div>
371: #if ($showDate == true && $article.date)
372: <div class="card-footer border-top rounded-bottom bg-white text-muted p-3">
373: <ul class="list-unstyled d-flex align-items-center m-0">
374: <li class="card-entry-date">
375: <span class="small d-flex align-items-center">
376: <span class="fa-regular fa-calendar"></span>
377: <span class="ms-2 date">$formatter.formatDate($article.date, $dateFormat)</span>
378: </span>
379: </li>
380: </ul>
381: </div>
382: #end
383: </div>
384: </div> ## card
385: #end ## loop
386: </div>
387: </div>
388: #end ## printReleases
389:
390: #macro (gamelogData $p $categoryLabel)
391:
392: #set ($p = $positions.get($p))
393: #set ($gamelogs = $gamelogs.get($p))
394: #if (!$categoryLabel || $categoryLabel.length() == 0) #set ($categoryLabel = "Statistics") #end
395:
396: #if ($hasEvents)
397: <div class="stats-box full clearfix">
398: <div class="table-responsive-via-datatables">
399: <table class="table table-hover nowrap w-100" data-searching="false" data-ordering="false" data-paging="false" data-info="false" data-filtering="false" data-scroll-y="50vh" data-module="theme-module/table-sort-bs">
400: <caption class="visually-hidden">Game Log - ${categoryLabel}</caption>
401: <thead class="thead-dark">
402: <tr>
403: <th scope="col">Date</th>
404: <th scope="col" class="text-start">Opponent</th>
405: <th scope="col" class="">Score</th>
406: #foreach ($gamelog in $gamelogs)
407: <th scope="col" class="text-uppercase text-center">$gamelog</th>
408: #end
409: </tr>
410: </thead>
411: <tbody>
412: #foreach ($event in $events)
413: <tr>
414: <td scope="row">$formatter.formatDate($event.event.date, "MMM d")</td>
415: <td class="text-start">
416: #if ($event.event.neutralSite.length() > 0) vs. #elseif (!$event.event.home) at #end
417: $event.event.opponent.name
418: </td>
419: <td class="">
420: #if ($event.event.statusCode >= 0)
421: #if ($event.event.eventId.length() > 0 && $event.stats.size() > 0)
422: <a #printResultAriaLabel($event.event) href="../boxscores/${formatter.formatBoxScoreLink($event.event)}">${event.event.APResult}</a>
423: #else
424: ${event.event.APResult}
425: #end
426: #end
427: </td>
428: #foreach ($gamelog in $gamelogs.keySet())
429: #set ($value = "-")
430: #set ($value = $formatter.formatNumber($event.stats.get($gamelog), $formats.get($gamelog)))
431: <td class="text-center">$value</td>
432: #end
433: </tr>
434: #end
435: </tbody>
436: </table>
437: </div> ## table-responsive
438: </div> ## stats-box
439: #end
440:
441: #end ## macro gamelogData
442:
443: #macro (splitWithLabels $statPosBriefs $label $stats)
444: <tr>
445: <th scope="row" class="text-end">${label}</th>
446:
447: #if ($rosterTransactions && $v == "career")
448: #set($keys = $stats.names())
449: #set($array = $keys.toString().replace('"','').split(","))
450: #foreach ($brief in $statPosBriefs.keySet())
451: #set ($value = "-")
452: #if($array.contains($brief))
453: #set ($value = $!formatter.formatNumber($tool.math.toDouble($stats.get($brief)), $formats.get($brief)))
454: #end
455: <td class="text-center">#if ($value.length() > 0) $value #else - #end</td>
456: #end
457: #else
458: #foreach ($brief in $statPosBriefs.keySet())
459: #set ($value = "-")
460: #set ($value = $!formatter.formatNumber($stats.get($brief), $formats.get($brief)))
461: <td class="text-center">#if ($value.length() > 0) $value #else - #end</td>
462: #end
463: #end
464: </tr>
465: #end
466:
467: #macro (careerData $p $categoryLabel)
468: #set ($p = $positions.get($p))
469: #set ($statPosBriefs = $briefs.get($p))
470: #if (!$categoryLabel || $categoryLabel.length() == 0) #set ($categoryLabel = "Statistics") #end
471:
472: <div class="stats-box full clearfix">
473: <div class="table-responsive-via-datatables table-responsive-webkit-overflow-scroll-fix">
474: <table class="table table-hover nowrap w-100" data-searching="false" data-ordering="false" data-paging="false" data-info="false" data-filtering="false" data-scroll-y="50vh" data-module="theme-module/table-sort-bs">
475: <caption class="visually-hidden">Career Stats - ${categoryLabel}</caption>
476: <thead class="thead-dark">
477: <tr>
478: <th scope="col"><span class="visually-hidden">Statistic</span></th>
479: #foreach ($brief in $statPosBriefs)
480: <th scope="col" class="text-center text-uppercase">$brief</th>
481: #end
482: </tr>
483: </thead>
484: <tbody>
485: #if ($rosterTransactions)
486: #set ($seasonLength = $career.seasons.length())
487: #foreach ($index in [0..$tool.math.sub($seasonLength, 1)])
488: #set($season = $career.seasons[$index])
489: #if($season.seasonStatsURL != "null")
490: #set ($label = "<a href='${season.seasonStatsURL}?view=profile'>$season.seasonName.replaceAll('^[^0-9-]*','') - $season.team.teamName</a>")
491: #else
492: #set ($label = "$season.seasonName.replaceAll('^[^0-9-]*','') - $season.team.teamName ")
493: #end
494: #splitWithLabels($statPosBriefs, $label, $season.player.stats)
495: #end
496: #splitWithLabels($statPosBriefs, "Total", $career.totals)
497: #else
498: #set ($careerTotals = $request.getAttribute("careerTotals"))
499: #set ($careerMap = $request.getAttribute("careerMap"))
500: #foreach ($season in $seasons)
501: ## Check if we did not get stats for this season
502: #if ($careerMap.get($season.seasonName))
503: #set ($label = "<a href='${season.path}?view=profile'>$season.seasonName</a>")
504: #splitWithLabels($statPosBriefs, $label, $careerMap[$season.seasonName])
505: #elseif ($wiki.valid())
506: <tr>
507: <td scope="row" class="text-end">
508: ${season.seasonName}
509: <span class="d-inline-block" tabindex="0" data-bs-toggle="tooltip" data-bs-placement="right" title="We could not find the 'players' page in the ${season.seasonName} section.">
510: <span class="fa fa-light fa-circle-info"></span>
511: </span>
512: </td>
513: #foreach ( $i in [0..$tool.math.sub($statPosBriefs.size(), 1)])
514: <td class="text-center"> </td>
515: #end
516: </tr>
517: #end
518: #end
519: #splitWithLabels($statPosBriefs, "Total", $request.getAttribute("careerTotals").overall)
520: #end
521: </tbody>
522: </table>
523: </div> ## table-responsive
524: </div> ## stats-box
525:
526: #end ## macro careerData
527:
528: #macro (printGroupLabel $label $emptyColumnSize)
529: <tr class="group table-active">
530: <td><strong>$label</strong></td>
531: #foreach ( $i in [1..$emptyColumnSize])
532: <td></td>
533: #end
534: </tr>
535: #end
536:
537: #macro (splitsData $p $categoryLabel)
538:
539: #set ($p = $positions.get($p))
540: #set ($statPosBriefs = $briefs.get($p))
541: #if (!$categoryLabel || $categoryLabel.length() == 0) #set ($categoryLabel = "Statistics") #end
542:
543: #if ($statPosBriefs.size() > 0)
544: <div class="stats-box full clearfix">
545: <div class="table-responsive-via-datatables">
546: <table class="table table-hover nowrap w-100" data-searching="false" data-ordering="false" data-paging="false" data-info="false" data-filtering="false" data-scroll-y="50vh" data-module="theme-module/table-sort-bs">
547: <caption class="visually-hidden">Split Stats - ${categoryLabel}</caption>
548: <thead class="thead-dark">
549: <tr>
550: <th scope="col"><span class="visually-hidden">Statistic</span></th>
551: #foreach ($brief in $statPosBriefs)
552: <th scope="col" class="text-center text-uppercase">$brief</th>
553: #end
554: </tr>
555: </thead>
556:
557: <tbody>
558: #printGroupLabel("Event", $statPosBriefs.size())
559: #splitWithLabels($statPosBriefs, "Total", $splits.overall)
560: #splitWithLabels($statPosBriefs, "Conference", $splits.conference)
561: #splitWithLabels($statPosBriefs, "Exhibition", $splits.exhibition)
562:
563: #printGroupLabel("Location", $statPosBriefs.size())
564: #splitWithLabels($statPosBriefs, "Home", $splits.home)
565: #splitWithLabels($statPosBriefs, "Away", $splits.away)
566: #splitWithLabels($statPosBriefs, "Neutral", $splits.neutral)
567:
568: #printGroupLabel("Result", $statPosBriefs.size())
569: #foreach($gameResult in $gamesResults.entrySet())
570: #if ($gameResult.key == "wins")
571: #set ($splitGameResult = $splits.inWins)
572: #elseif ($gameResult.key == "losses")
573: #set ($splitGameResult = $splits.inLosses)
574: #elseif ($gameResult.key == "ties")
575: #set ($splitGameResult = $splits.inTies)
576: #end
577:
578: #splitWithLabels($statPosBriefs, $gameResult.value, $splitGameResult)
579: #end
580:
581:
582: #if ($monthsPlayed and $monthsPlayed.size() > 0)
583:
584: #printGroupLabel("Month", $statPosBriefs.size())
585:
586: #foreach($month in $monthsPlayed)
587: #if ($month == 'January')
588: #set ($splitMonth = $splits.january)
589: #elseif ($month == 'February')
590: #set ($splitMonth = $splits.february)
591: #elseif ($month == 'March')
592: #set($splitMonth = $splits.march)
593: #elseif ($month == 'April')
594: #set($splitMonth = $splits.april)
595: #elseif ($month == 'May')
596: #set ($splitMonth = $splits.may)
597: #elseif ($month == 'June')
598: #set ($splitMonth = $splits.june)
599: #elseif ($month == 'July')
600: #set($splitMonth = $splits.july)
601: #elseif ($month == 'August')
602: #set ($splitMonth = $splits.august)
603: #elseif ($month == 'September')
604: #set($splitMonth = $splits.september)
605: #elseif ($month == 'October')
606: #set($splitMonth = $splits.october)
607: #elseif ($month == 'November')
608: #set ($splitMonth = $splits.november)
609: #elseif ($month == 'December')
610: #set($splitMonth = $splits.december)
611: #end
612:
613: #splitWithLabels($statPosBriefs, $month, $splitMonth)
614: #end ## foreach
615: #end
616: </tbody>
617: </table>
618: </div> ## table-responsive
619: </div> ## stats-box
620: #end
621:
622: #end ## macro splitsData
623:
624: #macro (printRecentGames)
625: #if ($hasEvents)
626: <div class="table-responsive-via-datatables">
627: <table class="table table-hover nowrap w-100" data-searching="false" data-ordering="false" data-paging="false" data-info="false" data-filtering="false" data-scroll-y="50vh" data-module="theme-module/table-sort-bs">
628: <caption class="visually-hidden">Recent Games</caption>
629: <thead class="thead-dark">
630: <tr>
631: <th scope="col" class="text-start">Date</th>
632: <th scope="col" class="text-start">Opponent</th>
633: <th scope="col">Result</th>
634: </tr>
635: </thead>
636: <tbody>
637: #set ($eventEnd = -1)
638: #foreach ($event in $events)
639: #if ($event.event.result.resolved)
640: #set ($eventEnd = $velocityCount)
641: #end
642: #end
643:
644: #set ($eventStart = $eventEnd - 5)
645: #if ($eventStart < 0) #set ($eventStart = 0) #end
646:
647: #foreach ($event in $events)
648: #if ($velocityCount >= $eventStart and $velocityCount <= $eventEnd)
649: <tr>
650: <td scope="row" class="text-start">$formatter.formatDate($event.event.date, "MMM d")</td>
651: <td class="text-start">
652: #if ($event.event.neutralSite.length() > 0) vs.
653: #elseif (!$event.event.home) at
654: #else ## nothing for a home game
655: #end
656: $event.event.opponent.name
657: </td>
658: <td>
659: #if ($event.event.statusCode >= 0)
660: #if ($event.event.eventId.length() > 0 && $event.stats.size() > 0)
661: <a #printResultAriaLabel($event.event) href="../boxscores/${formatter.formatBoxScoreLink($event.event)}">${event.event.APResult}</a>
662: #else
663: ${event.event.APResult}
664: #end
665: #end
666: </td>
667: </tr>
668: #end ## if
669: #end
670: </tbody>
671: </table>
672: </div>
673: #end
674: #end ## macro printRecentGames
675:
676: #macro (printCategories $briefCategoryLabels $v $ariaLabel)
677: <div class="$classTabPaneContent has-child-tabs">
678: <div class="d-flex flex-row text-nowrap align-items-center justify-content-center">
679: <div class="secondary-tab-select-container flex-fill">
680: <select class="tab-nav-select-helper form-select" id="bio-tabs-${v}-select" aria-label="Choose a stat group">
681: #foreach($briefCat in $briefCategoryLabels.entrySet())
682: #set ($briefCatLabel = $briefCat.value)
683: #set ($briefCatKey = $briefCat.key)
684: #if ($locale == "en_gb" && $briefCatLabel == "Defense")
685: #set ($briefCatLabel = "Defence")
686: #end
687: <option value="#${v}-tab-pos-${briefCatKey}-content" #if ($pos == $briefCat.key || $foreach.first) selected #end>${briefCatLabel}</option>
688: #end
689: </select>
690: <script>
691: $('.tab-nav-select-helper').on('change', function(e) {
692: var id = $(this).val();
693: $('a[data-bs-target="' + id + '"]').tab('show');
694: });
695: </script>
696: </div>
697: </div>
698: <div class="$classBioTabChildrenWrapper" data-momentum="false">
699: <ul class="$classBioTabChildren" id="bio-tabs-${v}" role="tablist">
700: #foreach($briefCat in $briefCategoryLabels.entrySet())
701: #set ($briefCatLabel = $briefCat.value)
702: #set ($briefCatKey = $briefCat.key)
703: #if ($locale == "en_gb" && $briefCatLabel == "Defense")
704: #set ($briefCatLabel = "Defence")
705: #end
706: <li class="nav-item flex-fill flex-md-grow-0 flex-md-shrink-0" role="presentation">
707: <a data-bs-toggle="tab" id="${v}-tab-pos-${briefCatKey}" class="nav-link#if ($activePos == $briefCatKey) active#end" data-bs-target="#${v}-tab-pos-${briefCatKey}-content" href="${page.url}?view=${v}&pos=${briefCatKey}" role="tab" aria-label="${ariaLabel}: ${briefCatLabel}">${briefCatLabel}</a>
708: </li>
709: #end
710: </ul>
711: </div>
712: <div class="tab-content py-3" id="${v}-tab-content">
713: #foreach ($briefCat in $briefCategoryLabels.entrySet())
714: #set ($briefCatLabel = $briefCat.value)
715: #set ($briefCatKey = $briefCat.key)
716: #set ($class = "tab-panel")
717: #if ($briefCat.key == $activePos)
718: #set ($class = "tab-panel active show")
719: #end
720: <div class="tab-pane fade ${class}" id="${v}-tab-pos-${briefCatKey}-content" role="tabpanel" aria-labelledby="${v}-tab-pos-${briefCatKey}">
721: <div class="stats-wrap $classTabPaneContentChild">
722: #if ($v == "splits")
723: #splitsData($briefCat.key $briefCatLabel)
724: #elseif ($v == "career")
725: #careerData($briefCat.key $briefCatLabel)
726: #end
727: </div>
728: </div>
729: #end
730: </div>
731: </div>
732: #end ## macro printCategories
733:
734: #macro (printHeadshot $class)
735: #if ($headshot.url)
736: <img src="$headshot.url?max_width=510&max_height=600" class="$class" alt="$fullName" />
737: #elseif ($options.get("roster_default_thumbnail").length() > 0)
738: <span class="d-block" aria-hidden="true" style="background-image:url('$options.get("roster_default_thumbnail")'); background-position:center center; background-repeat:no-repeat; background-size:cover;"></span>
739: #else
740: <span class="d-flex align-items-center justify-content-center text-primary ps-img-placeholder-bg">
741: <span class="fa-regular fa-image fa-xl opacity-1"></span>
742: </span>
743: #end
744: #end ## macro printHeadshot
745:
746: #set ($socialBrands = ["facebook", "twitter", "instagram", "youtube", "twitch", "tiktok", "nil"])
747:
748: #macro (buildSocialLink $brand $handle $icons $class)
749: #if($brand == "facebook")
750: #set($socialHost = "https://www.facebook.com")
751: #elseif($brand == "twitter")
752: #set($socialHost = "https://twitter.com")
753: #elseif($brand == "instagram")
754: #set($socialHost = "https://www.instagram.com")
755: #elseif($brand == "tikTok")
756: #set($socialHost = "https://www.tiktok.com")
757: #elseif($brand == "tiktok")
758: #set($socialHost = "https://www.tiktok.com")
759: #elseif($brand == "twitch")
760: #set($socialHost = "https://www.twitch.tv")
761: #elseif($brand == "youtube")
762: #set($socialHost = "https://www.youtube.com")
763: #elseif($brand == "nil")
764: #set($socialHost = "") ## We cannot define a host because the data entry can accept all NIL host services. Opendorse, Influencer, Fanatics, etc.
765: #end
766:
767: #if($socialHost.length() > 0 )
768: #set($url = "${socialHost}/${handle}")
769: #elseif($brand == "nil")
770: #set($url = "${handle}")
771: #else
772: #set($url = "")
773: #end
774:
775: #set($icons = $Boolean.parseBoolean($icons))
776: #if($icons == true)
777: <a href="$url" class="$class" target="_blank" aria-label="$brand"><span aria-hidden="true" class="#if($brand == 'nil')fa-kit #else fa fa-brands #end #if($brand == 'twitter') fa-x-twitter #else fa-$brand.toLowerCase() #end"></span></a>
778: #else
779: <a href="$url" class="$class" target="_blank">$handle</a>
780: #end
781: #end
782:
783: #macro(playerHeading)
784: <div class="player-heading animated h3 bg-primary d-flex align-content-stretch text-white position-relative z-index-1 rounded-top overflow-hidden mb-0">
785: #if ($!attributes.get("number").length() > 0)<span class="number bg-secondary inline-block text-white fs-2 lh-1 p-3">$!attributes.get("number")</span>#end
786: <span class="name inline-block w-100 flex-grow-1 p-3">$fullName</span>
787: #set ($hasSocialLinks = false)
788: #foreach ($field in $fields)
789: #if ($socialBrands.contains($field.key.toLowerCase()) && $attributes.get($field.key).length() > 0)
790: #set ($hasSocialLinks = true)
791: #end
792: #end
793: #if ($hasSocialLinks)
794: <span class="social-handle-link inline-block p-3">
795: <ul class="d-flex align-content-center h-100 gap-3 list-unstyled m-0">
796: #foreach ($field in $fields)
797: #if ($socialBrands.contains($field.key.toLowerCase()) && $attributes.get($field.key).length() > 0)
798: <li class="d-flex flex-column align-content-center justify-content-center">
799: #buildSocialLink($field.value.toLowerCase(), $!attributes.get($field.key), true, "btn btn-lg btn-link text-white p-0")
800: </li>
801: #end
802: #end
803: </ul>
804: </span>
805: #end
806: </div>
807: <script>
808: $(document).ready(function() {
809: $('.player-heading.animated .name').addClass('visible');
810: $('.player-heading.animated .number').addClass('visible');
811: });
812: </script>
813:
814: #end
815:
816: #macro (printBioInfo)
817: #if ($enhancedLayout)
818: #set ($classList = "d-flex flex-row flex-wrap justify-content-between row")
819: #set ($classListItems = "col-12 col-lg-6 px-md-3")
820: #set ($definitionListItems = "border-bottom m-0 p-2 p-lg-3 h-100")
821: #else
822: #set ($classList = "d-flex flex-column justify-content-start align-items-start")
823: #set ($classListItems = "flex-grow-1 w-100 p-2 border-bottom")
824: #set ($definitionListItems = " m-0 h-100 d-flex flex-column justify-content-start align-items-start")
825: #end
826:
827: #if ($enhancedLayout)
828: #playerHeading()
829: #end
830: <div class="container-fluid">
831: <div class="roster-player-fields mt-3">
832: <ul class="list-unstyled ${classList}">
833: #foreach ($i in [1..10])
834: #set ($stickyKey = "bio_custom${i}_sticky")
835: #if ($options.get($stickyKey).length() > 0 && $attributes.get("custom${i}").length() > 0)
836: <li class="$classListItems bio-field-custom-sticky">
837: <dl class="${definitionListItems}">
838: <dt class="label p-0 me-2">$options.get($stickyKey): </dt>
839: <dd class="value p-0 m-0 text-muted">$!attributes.get("custom${i}")</dd>
840: </dl>
841: </li>
842: #end
843: #end
844:
845: #foreach ($field in $fields)
846: #if (!$field.key.startsWith("custom"))
847: #if ($attributes.get($field.key).length() > 0 && ($field.key != "first_name" && $field.key != "last_name" && $field.key != "number" && $field.key != "full_name"))
848: #if ($field.key == "phone1" || $field.key == "phone2")
849: <li class="$classListItems bio-field-standard">
850: <dl class="${definitionListItems}">
851: <dt class="label p-0 me-2 d-inline">Phone: </dt>
852: <dd class="value p-0 m-0 d-inline text-muted">$!attributes.get($field.key)</dd>
853: </dl>
854: </li>
855: #elseif ($field.key == "email_address")
856: <li class="$classListItems bio-field-standard">
857: <dl class="${definitionListItems}">
858: #set ($emailAdd = $attributes.get($field.key))
859: <dt class="label p-0 me-2 d-inline">Email: </dt>
860: <dd class="value p-0 m-0 text-truncate d-inline text-muted"><a href="mailto:${emailAdd}">$emailAdd</a></dd>
861: </dl>
862: </li>
863: #elseif ($field.key == "weight_class")
864: <li class="$classListItems bio-field-standard">
865: <dl class="${definitionListItems}">
866: <dt class="label p-0 me-2 d-inline">Class: </dt>
867: <dd class="value p-0 m-0 d-inline text-muted">$!attributes.get($field.key)</dd>
868: </dl>
869: </li>
870: #elseif ($socialBrands.contains($field.value.toLowerCase()))
871: <li class="$classListItems bio-field-standard">
872: <dl class="${definitionListItems}">
873: <dt class="label p-0 me-2 d-inline">$field.value: </dt>
874: <dd class="value p-0 m-0 d-inline text-muted">#buildSocialLink($field.value.toLowerCase(), $!attributes.get($field.key), false, "")</dd>
875: </dl>
876: </li>
877: #elseif ($field.key != "position_abbr")
878: <li class="$classListItems bio-field-standard">
879: <dl class="${definitionListItems}">
880: <dt class="label p-0 me-2 d-inline">$field.value: </dt>
881: <dd class="value p-0 m-0 d-inline text-muted">$!attributes.get($field.key)</dd>
882: </dl>
883: </li>
884: #end
885: #end
886: #end
887: #end
888:
889: #foreach ($i in [1..10])
890: #set ($customKey = "bio_custom${i}")
891: #if ($options.get($customKey).length() > 0 && $attributes.get("custom${i}"))
892: <li class="$classListItems bio-field-custom">
893: <dl class="${definitionListItems}">
894: <dt class="label p-0 me-2 d-inline">$options.get($customKey): </dt>
895: <dd class="value p-0 m-0 d-inline text-muted">$!attributes.get("custom${i}")</dd>
896: </dl>
897: </li>
898: #end
899: #end
900: </ul>
901: </div>
902: </div>
903: #end ## macro printBioInfo
904:
905: #macro (printActionShots)
906: #if ($showActionShots)
907: ## FILTERS OUT THE NUMBER OF ACTION PHOTOS
908: #set ($totalPhotoAvaiable = $playerPhotos.size())
909: #set ($playerPhotosFiltered = $playerPhotos)
910: #if ($actionShotsLimit < $totalPhotoAvaiable)
911: #set ($playerPhotosFiltered = $playerPhotos.subList(0, $actionShotsLimit))
912: #end
913: #set ($playerPhotosFiltered = $tool.sorter.sort($playerPhotosFiltered, "lastUpdated:desc"))
914: <div class="action-shots clearfix mb-md-n5 d-none d-sm-none d-md-block rounded">
915: <div id="action-shots-carousel" class="carousel slide carousel-fade" data-bs-interval="12000" data-bs-ride="carousel">
916: <ol class="carousel-indicators pb-sm-3 mb-sm-5">
917: #foreach($photo in $playerPhotosFiltered)
918: <li data-bs-target="#action-shots-carousel" data-bs-slide-to="$foreach.index" class="#if ($foreach.index == 0)active#end"></li>
919: #end
920: </ol>
921: <div class="carousel-inner ratio ratio-21x9">
922: #foreach($photo in $playerPhotosFiltered)
923: #set ($imgAlt = "Large featured action photo of $fullName - Image $foreach.count")
924: #if ($photo.altText.length() > 0)
925: #set ($imgAlt = $photo.altText)
926: #elseif( $photo.title.length() > 0 )
927: #set ($imgAlt = $photo.title)
928: #end
929: <div class="carousel-item#if ($foreach.index == 0) active#end">
930: <img src="${photo.url}?max_width=1200" alt="$imgAlt" class="d-block w-100" data-lastupdated="$photo.lastUpdated" />
931: </div>
932: #end
933: </div>
934: </div>
935: </div>
936: #end
937: #end ## macro printActionShots
938:
939: #macro (printHighlights)
940: #if ($highlights && $showHighlights)
941: <div class="roster-bio-highlights bg-light bg-gradient text-dark bg-opacity-25 w-100 border rounded">
942: <ul class="d-flex flex-row flex-wrap justify-content-between list-unstyled m-0">
943: #foreach ($highlight in $highlights.keySet())
944: #set ($value = "-")
945: #set ($value = $formatter.formatNumber($stats.get($highlight), $formats.get($highlight)))
946: <li class="flex-fill text-center border-end">
947: <dl class="stat d-block m-0 p-3">
948: <dt class="d-block label p-0 m-0 text-uppercase fw-normal small">$!highlights.get($highlight)</dt>
949: <dd class="d-block value p-0 m-0 fs-4 fw-bold lh-1">$value</dd>
950: </dl>
951: </li>
952: #end
953: </ul>
954: </div>
955: #end
956: #end ## macro printHighlights
957:
958: #macro (printRoster)
959: #if ($enhancedLayout)
960: $website.includeAgain("${page.url}?tmpl=roster-switcher-template&id=roster-list")
961: #else
962: #set ($id = "roster-switcher")
963: #if ($request.getParameter("id").length() > 0)
964: #set ($id = $request.getParameter("id"))
965: #end
966:
967: #if ($page.contentType == "loki/bio")
968: #set ($headlinesFeaturedSize = 0)
969: #foreach ($featuredPage in $page.headlinesFeatured)
970: #if ($featuredPage.contentType == "loki/headlines")
971: #set ($headlinesFeaturedSize = $headlinesFeaturedSize + 1)
972: #end
973: #end
974: #if ($headlinesFeaturedSize > 0)
975: <div id="$id" class="float-md-end roster-switcher-template">
976: <div class="input-group">
977: <span class="input-group-text" id="${id}-group-text">Related Bios</span>
978: <select class="form-select" id="${id}" aria-describedby="${id}-group-text" onchange="location=this.value;">
979: #set ($listItems = [])
980: #foreach ($featuredPage in $page.headlinesFeatured)
981: #if ($featuredPage.contentType == "loki/headlines")
982: $website.includeAgain("${featuredPage.url}?tmpl=roster-list-template")
983: #set ($headlines = $request.getAttribute("headlines"))
984: #foreach ($bio in $headlines)
985: #set ($b = $bio.getDataAsObject().getAttributes())
986: #set ($fullName = "")
987: #if ($b.get("full_name"))
988: #set ($fullName = $b.get("full_name"))
989: #else
990: #if ($b.get("first_name") && $b.get("last_name"))
991: #set ($firstName = $b.get("first_name"))
992: #set ($lastName = $b.get("last_name"))
993: #set ($fullName = "${firstName} ${lastName}")
994: #end
995: #end
996: #if ($fullName.length() > 0)
997: #if (!$listItems.contains($bio.url))
998: #set($dummy = $listItems.add($bio.url))
999: <option value="${bio.url}" data-url="${bio.url}" data-title="${fullName}" #if ($page.url == $bio.url)selected#end>${fullName}</option>
1000: #end
1001: #end
1002: #end
1003: #end
1004: #end
1005: </select>
1006: </div>
1007: </div>
1008: #end
1009: #elseif ($page.contentType == "loki/bio-network")
1010: #set ($relatedPlayers = $page.sectionPage.children)
1011: #set ($teamNames = {})
1012: #foreach ($relatedPlayer in $relatedPlayers)
1013: #if ($relatedPlayer.contentType == "loki/bio-network")
1014: #set ($relatedPlayerObj = $relatedPlayer.getDataAsObject().getAttributes())
1015: #set ($teamName = $relatedPlayerObj.get("team"))
1016: #if ($teamName.length() > 0)
1017: #if (!$teamNames.containsValue($teamName))
1018: $!teamNames.put($tool.math.add($teamNames.size(), 1), $teamName)
1019: #end
1020: #end
1021: #end
1022: #end
1023: <div id="$id" class="float-md-end roster-switcher-template">
1024: <div class="input-group">
1025: <span class="input-group-text" id="${id}-group-text">Related Bios</span>
1026: <select class="form-select" id="${id}" aria-describedby="${id}-group-text" onchange="location=this.value;">
1027: #foreach ($i in [1..$teamNames.size()])
1028: #if ($teamNames.size() > 1)
1029: <optgroup label="$teamNames.get($i)">
1030: #end
1031:
1032: #foreach ($relatedPlayer in $relatedPlayers)
1033: #if ($relatedPlayer.contentType == "loki/bio-network")
1034: #set ($relatedPlayerObj = $relatedPlayer.getDataAsObject().getAttributes())
1035: #set ($teamName = $relatedPlayerObj.get("team"))
1036: #if ($teamName.length() > 0 && $teamName == $teamNames.get($i))
1037: #set ($playerFirstName = $relatedPlayerObj.get("first_name"))
1038: #set ($playerLastName = $relatedPlayerObj.get("last_name"))
1039: <option value="$relatedPlayer.url" #if ($page.url == $relatedPlayer.url)selected#end>${playerFirstName} ${playerLastName}</option>
1040: #end
1041: #end
1042: #end
1043:
1044: #if ($teamNames.size() > 1)
1045: </optgroup>
1046: #end
1047: #end
1048: </select>
1049: </div>
1050: </div>
1051: #end
1052: #end ## enhancedLayout check
1053: #end ## macro printRoster
1054:
1055: ################################################## END MACROS #############################################################
1056:
1057: #if ($attributes.get("full_name").length() > 0)
1058: #set ($fullName = $attributes.get("full_name"))
1059: #else
1060: #set ($firstName = $!attributes.get("first_name"))
1061: #set ($lastName = $!attributes.get("last_name"))
1062: #set ($fullName = "${firstName} ${lastName}")
1063: #end
1064:
1065: #set ($actionShots = false)
1066: #if ($enhancedLayout && $playerPhotos.size() > 0)
1067: #set ($actionShots = true)
1068: #end
1069:
1070: #if ($enhancedLayout)
1071: #set ($classRoot = "bio-enhanced")
1072: #if ($actionShots && $showActionShots)
1073: #set ($classRoot = "${classRoot} action")
1074: #else
1075: #set ($classRoot = "${classRoot} plain")
1076: #end
1077: #set ($flexClass = "d-flex flex-column align-items-stretch justify-content-start gap-4 w-100 gap-4")
1078: #set ($bioCardClass = "col-auto")
1079: #set ($classBody = "flex-grow-1")
1080: #set ($classBioTabParentsWrapper = "nav-tabs-wrapper position-relative pt-3")
1081: #set ($classBioTabParents = "nav nav-tabs nav-tabs-responsive d-flex with-arrow lined flex-row text-nowrap justify-content-center gap-3")
1082: #set ($classBioTabChildrenWrapper = "nav-tabs-wrapper position-relative py-3 border-bottom d-none")
1083: #set ($classBioTabChildren = "nav nav-tabs nav-tabs-responsive d-flex with-arrow lined flex-row text-nowrap justify-content-center gap-3")
1084: #set ($classTabPaneContent = "tab-pane-contents p-3 border")
1085: #set ($classTabPaneContentChild = "tab-pane-contents p-0")
1086: #else
1087: #set ($classRoot = "bio-wrap ")
1088: #set ($flexClass = "d-flex flex-column align-items-stretch justify-content-start flex-md-row gap-4")
1089: #set ($bioContainerClass = "mt")
1090: #set ($bioCardClass = "min-width-300px max-width-md-300px")
1091: #set ($classBody = "flex-grow-1 overflow-hidden")
1092: #set ($classBioTabParentsWrapper = "nav-tabs-wrapper position-relative tab-nav")
1093: #set ($classBioTabParents = "nav nav-tabs nav-tabs-responsive d-flex with-arrow lined flex-row text-nowrap justify-content-center gap-3")
1094: #set ($classBioTabChildrenWrapper = "nav-tabs-wrapper position-relative tab-nav d-none")
1095: #set ($classBioTabChildren = "nav nav-tabs nav-tabs-responsive d-flex with-arrow lined flex-row text-nowrap justify-content-center gap-3")
1096: #set ($classTabPaneContent = "tab-pane-contents p-3 border")
1097: #set ($classTabPaneContentChild = "tab-pane-contents p-0")
1098:
1099: #end
1100:
1101: ## FULL ROSTER
1102: <div class="bio-template ${classRoot} #if ($highlights) bio-wrap-has-highlights #end d-flex flex-column align-items-stretch justify-content-start gap-4">
1103:
1104: <div class="bio-template-heading d-flex flex-column w-100 justify-content-center align-items-stretch gap-2 mb-3 d-none">
1105: #printTitle()
1106: #printLeadIn()
1107: </div>
1108:
1109: ## RELATED BIOS
1110: #if ($showRoster)
1111: <div class="container-fluid">
1112: <div class="related-bios">#printRoster()</div>
1113: </div>
1114: #end
1115:
1116: #if ($actionShots)
1117: #printActionShots()
1118: #end
1119:
1120: #if ($enhancedLayout)
1121: #else
1122: #playerHeading()
1123: #end
1124:
1125: <div class="roster-bio-container">
1126: <div class="${flexClass}">
1127: <div class="bio-card ${bioCardClass}">
1128: <div class="player-about clearfix">
1129: #if ($enhancedLayout)
1130: <div class="bio-card-enhanced d-flex flex-column flex-md-row align-items-stretch align-items-md-start justify-content-center justify-content-md-start gap-3">
1131: <div class="bcs-image flex-shrink-1 flex-grow-1 min-width-300px max-width-md-300px">
1132: <div class="player-headshot text-center position-relative z-index-1 #if($actionShots)mt-md-n5 #end shadow rounded border overflow-hidden ratio ratio-3x4">
1133: #printHeadshot("img-fluid img-thumbnail")
1134: </div>
1135: </div>
1136: <div class="flex-grow-1">
1137: <div class="player-info">#printBioInfo()</div>
1138: <div class="container-fluid">
1139: <div class="mt-3 mx-3 mt-lg-4 ">
1140: #printHighlights()
1141: </div>
1142: </div>
1143: </div>
1144: </div>
1145: #else
1146: <div class="bio-card-standard d-flex flex-column align-items-stretch justify-content-start gap-3">
1147: <div class="bcs-image flex-shrink-1 min-width-300px max-width-md-300px">
1148: <div class="player-headshot text-center position-relative z-index-1 mb-3 shadow rounded border overflow-hidden ratio ratio-3x4">
1149: #printHeadshot("img-fluid img-thumbnail")
1150: </div>
1151: </div>
1152: <div class="bcs-attributes">
1153: <div class="player-info">#printBioInfo()</div>
1154: </div>
1155: </div>
1156: #end
1157: </div>
1158: </div> ## bio-card
1159:
1160: #if ($view.length() > 0)
1161: $request.setAttribute("icl-responsive-tabs-script", true)
1162:
1163: <div class="bio-body ${classBody}">
1164:
1165: <div class="d-flex flex-column align-items-center justify-content-start gap-3">
1166: #if (!$enhancedLayout) #printHighlights #end
1167: <div class="tab-container w-100">
1168: #if ($statsURL.length() > 0 || $hasHTMLStats || $releases.size() > 0|| $playerPhotos.size() > 0 || $playerVideos.size() > 0)
1169: #set ($hasTabNav = true)
1170: <div class="$classBioTabParentsWrapper">
1171: <ul class="$classBioTabParents" id="bio-tabs-parents" role="tablist">
1172: #if ($hasSynopsis || $hasBioBrief)
1173: <li class="nav-item" role="presentation">
1174: <a data-bs-toggle="tab" id="bio-tab" class="nav-link #if ($view == "bio") active#end" data-bs-target="#bio" href="${page.url}?view=bio" role="tab">Bio</a>
1175: </li>
1176: #end
1177:
1178: #if ($statsURL.length() > 0)
1179: <li class="nav-item" role="presentation">
1180: <a data-bs-toggle="tab" id="profile-tab" class="nav-link#if ($view == "profile") active#end" data-bs-target="#profile" href="${page.url}?view=profile" role="tab">Player Profile</a>
1181: </li>
1182: <li class="nav-item" role="presentation">
1183: <a data-bs-toggle="tab" id="gamelog-tab" class="nav-link#if ($view == "gamelog") active#end" data-bs-target="#gamelog" href="${page.url}?view=gamelog" role="tab">Game Log</a>
1184: </li>
1185: #if ($showCareer)
1186: <li class="nav-item" role="presentation">
1187: <a data-bs-toggle="tab" id="career-tab" class="nav-link#if ($view == "career") active#end" data-bs-target="#career" href="${page.url}?view=career" role="tab">Career Stats</a>
1188: </li>
1189: #end
1190: <li class="nav-item" role="presentation">
1191: <a data-bs-toggle="tab" id="splits-tab" class="nav-link#if ($view == "splits") active#end" data-bs-target="#splits" href="${page.url}?view=splits" role="tab">Split Stats</a>
1192: </li>
1193: #end
1194:
1195: #if ($hasHTMLStats)
1196: <li class="nav-item" role="presentation">
1197: <a data-bs-toggle="tab" id="htmlstats-tab" class="nav-link#if ($view == "htmlstats") active#end" data-bs-target="#htmlstats" href="${page.url}?view=htmlstats" role="tab">HTML Stats</a>
1198: </li>
1199: #end
1200:
1201: #if ($releases.size() > 0)
1202: <li class="nav-item" role="presentation">
1203: <a data-bs-toggle="tab" id="news-tab" class="nav-link#if ($view == "news") active#end" data-bs-target="#news" href="${page.url}?view=news" role="tab">News</a>
1204: </li>
1205: #end
1206:
1207: #if ($playerPhotos.size() > 0)
1208: <li class="nav-item" role="presentation">
1209: <a data-bs-toggle="tab" id="photos-tab" class="nav-link#if ($view == "photos") active#end" data-bs-target="#photos" href="${page.url}?view=photos" role="tab">Photos</a>
1210: </li>
1211: #end
1212:
1213: #if ($playerVideos.size() > 0)
1214: <li class="nav-item" role="presentation">
1215: <a data-bs-toggle="tab" id="videos-tab" class="nav-link#if ($view == "videos") active#end" data-bs-target="#videos" href="${page.url}?view=videos" role="tab">Videos</a>
1216: </li>
1217: #end
1218:
1219: ## WEPLAYED MOMENTS - THIRD-PARTY SUPPORT PLUGIN
1220: #if (!$page.url.contains("/coaches") && $options.get("weplayed_addon_code"))
1221: <li class="nav-item weplayed-hide-no-data #if ($view == "weplayed") active#end" role="presentation">
1222: <a data-toggle="tab" id="weplayed-tab" class="nav-link#if ($view == "weplayed") active#end" data-target="#weplayed" href="${page.url}?view=weplayed" role="tab">#Moments</a>
1223: </li>
1224: #end
1225: </ul>
1226: </div>
1227: #end
1228: <div class="tab-content py-3" id="roster-tab-content">
1229: ## BIO
1230: #if ($hasSynopsis || $hasBioBrief)
1231: #set ($class = "tab-panel")
1232: #if ($view == "bio")
1233: #set ($class = "tab-panel active show")
1234: #end
1235:
1236: <div class="tab-pane fade ${class}" id="bio" role="tabpanel" #if ($hasTabNav)aria-labelledby="bio-tab"#end>
1237: <div class="$classTabPaneContent synopsis">
1238: <h5 class="bio-tabbed-content-heading">Bio</h5>
1239: #if ($hasSynopsis)
1240: $synopsis
1241: #elseif ($hasBioBrief)
1242: $website.include("$bioBriefURL")
1243: #end
1244: </div>
1245: </div> ## tab-panel
1246: #end
1247:
1248: ## STATS
1249: #if ($statsURL.length() > 0)
1250:
1251: ## PROFILE
1252: #set ($class = "tab-panel")
1253: #if ($view == "profile")
1254: #set ($class = "tab-panel active show")
1255: #end
1256:
1257: <div class="tab-pane fade ${class}" id="profile" role="tabpanel" aria-labelledby="profile-tab">
1258: <div class="$classTabPaneContent stats-wrap">
1259: <div class="d-flex flex-column flex-md-row align-items-top justify-content-center gap-3">
1260: <div class="season-stats-overview flex-grow-1 flex-shrink-1 col-12 col-md-6">
1261: <div class="container-fluid p-0">
1262: <div class="bio-tabbed-content-heading h5">Player statistics</div>
1263: ## RANKING
1264: <div class="stats-box mb-3">
1265: #if ($statPos.length() > 0)
1266: $website.include("players?tmpl=stats-bios-rank-template&rank=${playerId}&pos=${statPos}")
1267: #end
1268: </div>
1269: </div>
1270: </div>
1271:
1272: ## LAST SIX GAMES
1273: <div class="recent-games-list flex-grow-1 flex-shrink-1 col-12 col-md-6">
1274: <div class="container-fluid p-0">
1275: <div class="bio-tabbed-content-heading h5">Recent results</div>
1276: <div class="stats-box mb-3">
1277: #printRecentGames()
1278: </div>
1279: </div>
1280: </div>
1281:
1282: </div>
1283: </div> ## stats-wrap
1284: </div> ## tab-content
1285:
1286: ## GAMELOG
1287: #set ($class = "tab-panel")
1288: #if ($view == "gamelog")
1289: #set ($class = "tab-panel active show")
1290: #end
1291:
1292: #set ($activePos = $statPos)
1293: #if ($view == "gamelog" && $paramPos.length() > 0)
1294: #if ($positions.get($paramPos).length() > 0)
1295: #set ($activePos = $positions.get($paramPos))
1296: #end
1297: #end
1298:
1299: <div class="tab-pane fade ${class}" id="gamelog" role="tabpanel" aria-labelledby="gamelog-tab">
1300: #if ($gamelogsCategoriesLabels)
1301: <div class="$classTabPaneContent has-child-tabs">
1302: <div class="d-flex flex-row text-nowrap align-items-center justify-content-center">
1303: <div class="secondary-tab-select-container flex-fill">
1304: <select class="tab-nav-select-helper form-select" id="bio-tabs-gamelog-select" aria-label="Choose a stat group">
1305: #foreach($briefCat in $gamelogsCategoriesLabels.entrySet())
1306: #set ($briefCatLabel = $briefCat.value)
1307: #set ($briefCatKey = $briefCat.key)
1308: #if ($locale == "en_gb" && $briefCatLabel == "Defense")
1309: #set ($briefCatLabel = "Defence")
1310: #end
1311: <option value="#gamelog-tab-pos-${briefCatKey}-content" #if ($pos == $briefCat.key || $foreach.first) selected #end>${briefCatLabel}</option>
1312: #end
1313: </select>
1314: <script>
1315: $('.tab-nav-select-helper').on('change', function(e) {
1316: var id = $(this).val();
1317: $('a[data-bs-target="' + id + '"]').tab('show');
1318: });
1319: </script>
1320: </div>
1321: </div>
1322: <div class="$classBioTabChildrenWrapper" data-momentum="false">
1323: <ul class="$classBioTabChildren" id="bio-tabs-gamelog" role="tablist">
1324: #foreach($gamelogsCatLabel in $gamelogsCategoriesLabels.entrySet())
1325: #set($gamelogsCatLabelVal = $gamelogsCatLabel.value)
1326: #set ($gamelogsCatLabelKey = $gamelogsCatLabel.key)
1327: #if ($locale == "en_gb" && $gamelogsCatLabelVal == "Defense")
1328: #set($gamelogsCatLabelVal = "Defence")
1329: #end
1330: <li class="nav-item flex-fill flex-md-grow-0 flex-md-shrink-0" role="presentation">
1331: <a data-bs-toggle="tab" id="gamelog-tab-pos-${gamelogsCatLabel.key}" class="nav-link#if ($activePos == $gamelogsCatLabel.key) active#end" data-bs-target="#gamelog-tab-pos-${gamelogsCatLabel.key}-content" href="${page.url}?view=gamelog&pos=${gamelogsCatLabel.key}" role="tab" aria-label="Game Log: ${gamelogsCatLabelVal}">$gamelogsCatLabelVal</a>
1332: </li>
1333: #end
1334: </ul>
1335: </div>
1336: <div class="tab-content py-3" id="gamelog-tab-content">
1337: #foreach($gamelogsCatLabel in $gamelogsCategoriesLabels.entrySet())
1338: #set ($class = "tab-panel")
1339: #if ($gamelogsCatLabel.key == $activePos)
1340: #set ($class = "tab-panel active show")
1341: #end
1342: <div class="tab-pane fade ${class}" id="gamelog-tab-pos-${gamelogsCatLabel.key}-content" role="tabpanel" aria-labelledby="gamelog-tab-pos-${gamelogsCatLabel.key}">
1343: <div class="stats-wrap $classTabPaneContentChild">
1344: <h5 class="bio-tabbed-content-heading visually-hidden">Game Log - <small class="text-muted"> $gamelogsCatLabel.value</small></h5></h4>
1345: #gamelogData($gamelogsCatLabel.key $gamelogsCatLabelVal)
1346: </div>
1347: </div>
1348: #end
1349: </div>
1350: </div>
1351: #else
1352: <div class="stats-wrap $classTabPaneContent">#gamelogData($pos "")</div>
1353: #end
1354:
1355: </div> ## tab-panel
1356:
1357: ## CAREER
1358: #if ($showCareer)
1359:
1360: #set ($activePos = $statPos)
1361: #if ($view == "career" && $paramPos.length() > 0)
1362: #if ($positions.get($paramPos).length() > 0)
1363: #set ($activePos = $positions.get($paramPos))
1364: #end
1365: #end
1366:
1367: #set ($class = "tab-panel")
1368: #if ($view == "career")
1369: #set ($class = "tab-panel active show")
1370: #end
1371:
1372: <div class="tab-pane fade ${class}" id="career" role="tabpanel" aria-labelledby="career-tab">
1373: #if ($briefsCategoriesLabels)
1374: #printCategories($briefsCategoriesLabels "career" "Career Stats")
1375: #else
1376: <div class="stats-wrap $classTabPaneContent">#careerData($activePos "")</div>
1377: #end
1378: </div>
1379: #end
1380:
1381: ## SPLITS
1382: #set ($class = "tab-panel clearfix")
1383: #if ($view == "splits")
1384: #set ($class = "tab-panel active show")
1385: #end
1386:
1387: #set ($activePos = $statPos)
1388: #if ($view == "splits" && $paramPos.length() > 0)
1389: #if ($positions.get($paramPos).length() > 0)
1390: #set ($activePos = $positions.get($paramPos))
1391: #end
1392: #end
1393:
1394: <div class="tab-pane fade ${class}" id="splits" role="tabpanel" aria-labelledby="splits-tab">
1395: #if ($briefsCategoriesLabels)
1396: #printCategories($briefsCategoriesLabels "splits" "Splits Stats")
1397: #else
1398: <div class="stats-wrap $classTabPaneContent">#splitsData($pos "")</div>
1399: #end
1400: </div>
1401: #end
1402:
1403: ## HTML STATS
1404: #if ($hasHTMLStats)
1405: #set ($class = "tab-panel clearfix")
1406: #if ($view == "htmlstats")
1407: #set ($class = "tab-panel active show")
1408: #end
1409: <div class="tab-pane fade ${class}" id="htmlstats" role="tabpanel" aria-labelledby="htmlstats-tab">
1410: <div class="$classTabPaneContent">
1411: <h5 class="bio-tabbed-content-heading">Other Stats</h5>
1412: <a href="${htmlStatsURL}" class="bio-htmlstats-identifier">Click to view HTML Stats</a>
1413: </div>
1414: </div>
1415: #end
1416:
1417: ## NEWS
1418: #if ($releases.size() > 0)
1419: #set ($class = "tab-panel clearfix")
1420: #if ($view == "news")
1421: #set ($class = "tab-panel active show")
1422: #end
1423: <div class="tab-pane fade ${class}" id="news" role="tabpanel" aria-labelledby="news-tab">
1424: <div class="$classTabPaneContent">
1425: <h5 class="bio-tabbed-content-heading">News mentions</h5>
1426: #printReleases($releases, "article")
1427: </div>
1428: </div>
1429: #end
1430:
1431: ## PHOTOS
1432: #if ($playerPhotos.size() > 0)
1433: #set ($class = "tab-panel clearfix")
1434: #if ($view == "photos")
1435: #set ($class = "tab-panel active show clearfix")
1436: #end
1437: <div class="tab-pane fade ${class}" id="photos" role="tabpanel" aria-labelledby="photos-tab">
1438: <div class="$classTabPaneContent">
1439: <h5 class="bio-tabbed-content-heading">Photos</h5>
1440: $website.includeAgain("${page.url}?tmpl=bio-photos-template")
1441: </div>
1442: </div>
1443: #end
1444:
1445: ## VIDEOS
1446: #if ($playerVideos.size() > 0)
1447: #set ($class = "tab-panel clearfix")
1448: #if ($view == "videos")
1449: #set ($class = "tab-panel active show clearfix")
1450: #end
1451: <div class="tab-pane fade ${class}" id="videos" role="tabpanel" aria-labelledby="videos-tab">
1452: <div class="$classTabPaneContent">
1453: <h5 class="bio-tabbed-content-heading">Videos</h5>
1454: #printReleases($playerVideos, "video")
1455: </div>
1456: </div>
1457: #end
1458:
1459: ## WEPLAYED MOMENTS - THIRD-PARTY SUPPORT PLUGIN
1460: #if (!$page.url.contains("/coaches") && $options.get("weplayed_addon_code"))
1461: #set ($class = "tab-panel clearfix")
1462: #if ($view == "weplayed")
1463: #set ($class = "tab-panel active show clearfix")
1464: #end
1465: <div class="tab-pane fade ${class} weplayed-hide-no-data" id="weplayed-tab" role="tabpanel" aria-labelledby="weplayed-tab">
1466: <div class="$classTabPaneContent">
1467: <div data-weplayed-widget></div>
1468: </div>
1469: </div>
1470: #end
1471:
1472: </div> ## tab-panels
1473: </div> ## tab-container
1474: </div>
1475: </div> ## body
1476: #end
1477: </div>
1478: </div>
1479:
1480: $wiki
1481: </div> ## ends bio-wrap
1482:
1483: ## GLOBAL ADS SERVER
1484: #if ($website.ads.isAdvertisingEnabled('BIOS'))
1485: $website.includeAgain("global-adserver-slots?adSlot=bios")
1486: #end
1487:
|