4221 lines
229 KiB
XML
4221 lines
229 KiB
XML
<?xml version="1.0" encoding="UTF-8"?>
|
|
<theme name="Default" author_name="Invision Power Services, Inc" author_url="https://www.invisioncommunity.com">
|
|
<template template_group="forums" template_name="clubForums" template_data="" template_location="front" template_app="forums"><![CDATA[
|
|
<header class='ipsPageHeader ipsPageHeader--forum-table' data-ips-hook="header">
|
|
<h1 data-ips-hook="title" class='ipsPageHeader__title'>{lang="club_node_forums"}</h1>
|
|
</header>
|
|
|
|
<ol class="ipsBlockSpacer" data-controller='forums.front.forum.forumList' data-baseURL=''>
|
|
<li class='ipsBox ipsPull'>
|
|
<h2 class="ipsBox__header">{lang="subforums_header_category"}</h2>
|
|
<div class='ipsBox__content'>
|
|
{{if \IPS\Member::loggedIn()->getLayoutValue('forums_forum') === 'grid'}}
|
|
<i-data>
|
|
<div class='ipsData ipsData--grid ipsData--forum-grid i-padding_3 i-background_2 i-border-end-start-radius_box i-border-end-end-radius_box'>
|
|
{{foreach \IPS\forums\Forum::clubNodes() as $childforum}}
|
|
{template="forumGridItem" group="index" app="forums" params="$childforum"}
|
|
{{endforeach}}
|
|
</div>
|
|
</i-data>
|
|
{{else}}
|
|
<i-data>
|
|
<ol class="ipsData ipsData--table ipsData--category ipsData--forum-category">
|
|
{{foreach \IPS\forums\Forum::clubNodes() as $childforum}}
|
|
{template="forumRow" group="index" app="forums" params="$childforum, TRUE"}
|
|
{{endforeach}}
|
|
</ol>
|
|
</i-data>
|
|
{{endif}}
|
|
</div>
|
|
</li>
|
|
</ol>]]></template>
|
|
<template template_group="forums" template_name="forumButtons" template_data="$forum" template_location="front" template_app="forums"><![CDATA[<ul data-ips-hook="buttons" class="ipsButtons ipsButtons--main ipsButtons--margin">
|
|
{{if $forum->isCombinedView()}}
|
|
<li>
|
|
<a class="ipsButton ipsButton--primary" href="{$forum->url()->setQueryString( [ 'do' => 'createMenu', 'root' => $forum->id ] )}" data-ipsDialog-title='{lang="select_forum"}' data-ipsDialog data-ipsDialog-size='narrow' title='{lang="create_new_topic"}' rel='nofollow noindex'><i class="fa-regular fa-pen-to-square"></i><span>{lang="start_new_topic"}</span></a>
|
|
</li>
|
|
{{elseif $forum->can('add')}}
|
|
<li>
|
|
<a class="ipsButton ipsButton--primary" href="{$forum->url()->setQueryString( 'do', 'add' )}" title='{lang="start_new_topic_desc"}' rel='nofollow noindex'><i class="fa-regular fa-pen-to-square"></i><span>{lang="start_new_topic"}</span></a>
|
|
</li>
|
|
{{endif}}
|
|
</ul>]]></template>
|
|
<template template_group="forums" template_name="forumDisplay" template_data="$forum, $table" template_location="front" template_app="forums"><![CDATA[
|
|
{{if $club = $forum->club()}}
|
|
{{if settings.clubs and settings.clubs_header == 'full'}}
|
|
{template="header" app="core" group="clubs" params="$club, $forum"}
|
|
{{endif}}
|
|
<div id='elClubContainer'>
|
|
{{endif}}
|
|
|
|
{{if $forum->feature_color}}<style>:root{--i-featured: {$forum->feature_color}}</style>{{endif}}
|
|
|
|
{{if !\IPS\Request::i()->advancedSearchForm}}
|
|
{{$followerCount = \IPS\forums\Topic::containerFollowerCount( $forum );}}
|
|
<header class="ipsPageHeader ipsBox ipsPull ipsPageHeader--topic-list {{if $forum->feature_color}}ipsPageHeader--hasFeatureColor{{endif}}" {{if $forum->feature_color}}style="--i-featured: {$forum->feature_color}"{{endif}}>
|
|
<div class="ipsPageHeader__row">
|
|
<div data-ips-hook="header" class='ipsPageHeader__primary'>
|
|
<h1 data-ips-hook="title" class='ipsPageHeader__title'>{$forum->_title}</h1>
|
|
{{if $forum->description}}
|
|
{template="richText" group="global" app="core" location="global" params="$forum->description, array('ipsPageHeader__desc')"}
|
|
{{endif}}
|
|
{{if \IPS\Application::appIsEnabled('cloud') AND \IPS\cloud\Application::featureIsEnabled( 'realtime' )}}
|
|
<div data-controller='cloud.front.realtime.whosViewing' data-location='{expression="\IPS\cloud\Realtime::i()->getLocationHash()"}'></div>
|
|
{{endif}}
|
|
</div>
|
|
{{if $forum->sub_can_post and !$forum->password}}
|
|
<ul class='ipsButtons'>
|
|
{{if \IPS\Application::appIsEnabled('cloud')}}
|
|
<li>{template="analyticsButton" app="cloud" group="analytics" params="$forum, $forum->_id"}</li>
|
|
{{endif}}
|
|
<li>{template="follow" app="core" group="global" params="'forums','forum', $forum->_id, $followerCount"}</li>
|
|
</ul>
|
|
{{endif}}
|
|
</div>
|
|
{{if $forum->isCombinedView()}}
|
|
<div class='ipsPageHeader__row ipsResponsive_hideDesktop'>
|
|
<ul data-ips-hook="buttons" class='ipsButtons ipsButtons--fill'>
|
|
<li>
|
|
<a class="ipsButton ipsButton--inherit" href="#" rel="nofollow" data-ipsDialog data-ipsDialog-title='{lang="forums_simple_dialog_title"}' data-ipsDialog-content='#elFluidFormFilters'>
|
|
<span data-role='fluidForumMobileDesc'>{lang="forums_simple_filter_by"}</span> <i class='fa-solid fa-angle-down'></i>
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
{{endif}}
|
|
{{if $forum->show_rules == 1}}
|
|
<div class='ipsPageHeader__row'>
|
|
<a href="#elForumRules" class='ipsJS_show' data-ipsDialog data-ipsDialog-title="{lang="forums_forum_{$forum->id}_rulestitle"}" data-ipsDialog-content="#elForumRules">{lang="forums_forum_{$forum->id}_rulestitle"}</a>
|
|
<div id='elForumRules' class='ipsJS_hide i-background_2 i-padding_3'>
|
|
{template="richText" group="global" app="core" location="global" params="\IPS\Member::loggedIn()->language()->addToStack('forums_forum_' . $forum->id . '_rules'), array('')"}
|
|
</div>
|
|
</div>
|
|
{{elseif $forum->show_rules == 2}}
|
|
<div class='ipsPageHeader__row'>
|
|
<strong class='i-font-size_2 i-font-weight_600 i-margin-bottom_1 i-display_block'>{lang="forums_forum_{$forum->id}_rulestitle"}</strong>
|
|
{template="richText" group="global" app="core" location="global" params="\IPS\Member::loggedIn()->language()->addToStack('forums_forum_' . $forum->id . '_rules'), array('')"}
|
|
</div>
|
|
{{endif}}
|
|
</header>
|
|
{{if ! $forum->isCombinedView() and $forum->children()}}
|
|
<div data-ips-hook="subForums" class='ipsBox ipsBox--forum-categories ipsPull' data-controller='core.global.core.table, forums.front.forum.forumList' data-baseURL=''>
|
|
<h2 class='ipsBox__header'>{{if $forum->sub_can_post}}{lang="subforums_header"}{{else}}{lang="subforums_header_category"}{{endif}}</h2>
|
|
<div class='ipsBox__content'>
|
|
{{if \IPS\Member::loggedIn()->getLayoutValue('forums_forum') === 'grid'}}
|
|
<i-data>
|
|
<ol class="ipsData ipsData--grid ipsData--forum-grid">
|
|
{{foreach $forum->children( 'view' ) as $childforum}}
|
|
{template="forumGridItem" group="index" app="forums" params="$childforum"}
|
|
{{endforeach}}
|
|
</ol>
|
|
</i-data>
|
|
{{else}}
|
|
<i-data>
|
|
<ol class="ipsData ipsData--table ipsData--category ipsData--forum-category">
|
|
{{foreach $forum->children( 'view' ) as $childforum}}
|
|
{template="forumRow" group="index" app="forums" params="$childforum, TRUE"}
|
|
{{endforeach}}
|
|
</ol>
|
|
</i-data>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
{{endif}}
|
|
<div data-controller='forums.front.forum.forumPage,cloud.front.realtime.viewingProvider'>
|
|
{template="forumButtons" group="forums" params="$forum"}
|
|
{$table|raw}
|
|
</div>
|
|
{{if \IPS\Member::loggedIn()->member_id || !\IPS\Request::i()->advancedSearchForm && $forum->sub_can_post and !$forum->password}}
|
|
<div class='ipsPageActions ipsBox i-padding_2 ipsPull ipsResponsive_showPhone'>
|
|
{{if \IPS\Application::appIsEnabled('cloud')}}
|
|
{template="analyticsButton" app="cloud" group="analytics" params="$forum, $forum->_id"}
|
|
{{endif}}
|
|
{{if \IPS\Member::loggedIn()->member_id}}
|
|
<a href="{$forum->url()->setQueryString( array( 'do' => 'markRead', 'fromForum' => 1 ) )->csrf()}" title='{lang="mark_forum_read_title"}' class='ipsButton ipsButton--inherit'><i class="fa-solid fa-check"></i><span>{lang="mark_forum_read"}</span></a>
|
|
{{endif}}
|
|
{{if !\IPS\Request::i()->advancedSearchForm && $forum->sub_can_post and !$forum->password}}
|
|
{template="follow" app="core" group="global" params="'forums','forum', $forum->_id, $followerCount"}
|
|
{{endif}}
|
|
</div>
|
|
{{endif}}
|
|
|
|
{{if $forum->club()}}
|
|
</div>
|
|
{{endif}}]]></template>
|
|
<template template_group="forums" template_name="forumHome" template_data="$forum, $featuredTopic, $popularQuestions, $newQuestions" template_location="front" template_app="forums"><![CDATA[
|
|
<!-- v5 todo: Is this template used? -->
|
|
<style>*{ color: #bde361 !important; }</style>
|
|
|
|
{{if $featuredTopic}}
|
|
<div class="i-padding_3">
|
|
<h2 class="ipsTitle ipsTitle--h3">{lang="featured_question"}</h2>
|
|
<br><br>
|
|
<div class="ipsPhotoPanel">
|
|
<span class="ipsUserPhoto">
|
|
<img src='{expression="$featuredTopic->author()->photo"}' alt='' loading='lazy'>
|
|
</span>
|
|
<div class='ipsPhotoPanel__text'>
|
|
<h3 class="i-font-size_2">
|
|
<a href="{$featuredTopic->url()}">{$featuredTopic->title}</a>
|
|
</h3>
|
|
<p class="i-color_soft">{lang="ask_byline" htmlsprintf="$featuredTopic->author()->link( NULL, NULL, $featuredTopic->isAnonymous() ), \IPS\DateTime::ts( $featuredTopic->start_date )->html( false )"}</p>
|
|
<br>
|
|
<div class="ipsTruncate_5">
|
|
{$featuredTopic->truncated()}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<hr class="ipsHr">
|
|
{{endif}}
|
|
<div class="ipsSpanGrid">
|
|
<div class="ipsSpanGrid__6 i-padding_3">
|
|
<h2 class="ipsTitle ipsTitle--h3">{lang="most_popular_questions"}</h2>
|
|
<p class="i-color_soft">{lang="from_the_past_30_days"}</p>
|
|
<i-data>
|
|
<ol class="ipsData ipsData--table ipsData--popular-questions" id="elTopicList">
|
|
{{foreach $popularQuestions as $question}}
|
|
<li class="ipsData__item" {{if $question->unread()}}data-ips-unread{{endif}}>
|
|
<div class='i-basis_50'>
|
|
<span class='ipsUserPhoto ipsUserPhoto--mini'>
|
|
<img src="{$question->author()->photo}" alt='' loading='lazy'>
|
|
</span>
|
|
</div>
|
|
<div class="ipsData__main">
|
|
<h4 class="ipsData__title">{{if $question->unread()}} <i class="fa-solid fa-circle cTopicIcon"></i> {{endif}}<a href="{$question->url()}">{$question->title}</a></h4>
|
|
<ul class="ipsData__meta ipsList ipsList--inline i-color_soft">
|
|
{{if $question->bestAnswer()}}
|
|
<li>
|
|
{lang="best_answer_by" htmlsprintf="$question->bestAnswer()->author()->link( NULL, NULL, $question->bestAnswer()->isAnonymous() ), \IPS\DateTime::ts( $question->bestAnswer()->post_date )->html( false )"}
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
</div>
|
|
</li>
|
|
{{endforeach}}
|
|
</ol>
|
|
</i-data>
|
|
</div>
|
|
<div class="ipsSpanGrid__6 i-padding_3">
|
|
<h2 class="ipsTitle ipsTitle--h3">{lang="new_questions"}</h2>
|
|
<p class="i-color_soft">{lang="awaiting_an_answer"}</p>
|
|
<ol class="ipsData ipsData--compact ipsData ipsData--question-list" id="elTopicList">
|
|
{{foreach $newQuestions as $question}}
|
|
<li class="ipsData__item" {{if $question->unread()}}data-ips-unread{{endif}}>
|
|
<div class='i-basis_50'>
|
|
<span class='ipsUserPhoto ipsUserPhoto--mini'>
|
|
<img src="{$question->author()->photo}" alt='' loading='lazy'>
|
|
</span>
|
|
</div>
|
|
<div class="ipsData__main">
|
|
<h4 class="ipsData__title">{{if $question->unread()}} <i class="fa-solid fa-circle cTopicIcon"></i> {{endif}}<a href="{$question->url()}">{$question->title}</a></h4>
|
|
<ul class="ipsData__meta ipsList ipsList--inline i-color_soft">
|
|
<li>
|
|
{lang="ask_byline" htmlsprintf="$question->author()->link( NULL, NULL, $question->isAnonymous() ), \IPS\DateTime::ts( $question->start_date )->html( false )"}
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</li>
|
|
{{endforeach}}
|
|
</ol>
|
|
</div>
|
|
</div>]]></template>
|
|
<template template_group="forums" template_name="forumPasswordPopup" template_data="$forum, $id, $action, $elements, $hiddenValues, $actionButtons, $uploadField, $class='', $attributes=array(), $sidebar=NULL, $form=NULL" template_location="front" template_app="forums"><![CDATA[{{if !\IPS\Request::i()->isAjax()}}<div class="ipsBox">{{endif}}
|
|
<form accept-charset='utf-8' class="ipsForm ipsForm--vertical ipsForm--forum-password" method='post' action='{$action}' data-ipsValidation novalidate>
|
|
<input type="hidden" name="{$id}_submitted" value="1">
|
|
{{foreach $hiddenValues as $k => $v}}
|
|
<input type="hidden" name="{$k}" value="{$v}">
|
|
{{endforeach}}
|
|
|
|
<div class='ipsBox__padding'>
|
|
<p class='i-font-size_3 i-font-weight_600 i-margin-bottom_2'>
|
|
{lang="enter_forum_password_1" sprintf="$forum->_title"}
|
|
</p>
|
|
<ul class='i-flex i-flex-wrap_wrap i-gap_1'>
|
|
{{foreach $elements as $collection}}
|
|
{{foreach $collection as $input}}
|
|
{{if $input instanceof \IPS\Helpers\Form\Text}}
|
|
<li class="i-basis_240 i-flex_91">
|
|
<input type="{$input->formType}" class="ipsInput ipsInput--text" required placeholder="{lang="$input->name"}" name='{$input->name}' id='{$input->htmlId}'>
|
|
{{if $input->error}}
|
|
<div class="ipsFieldRow__warning">{lang="$input->error"}</div>
|
|
{{endif}}
|
|
</li>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
{{endforeach}}
|
|
<li class="i-flex_11">
|
|
<button type="submit" class="ipsButton ipsButton--primary i-width_100p">{lang="enter_forum"}</button>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</form>
|
|
{{if !\IPS\Request::i()->isAjax()}}</div>{{endif}}]]></template>
|
|
<template template_group="forums" template_name="forumSelector" template_data="$form" template_location="front" template_app="forums"><![CDATA[
|
|
<div data-ips-template='forumSelector' {{if !\IPS\Request::i()->isAjax()}}class='ipsBox'{{endif}}>
|
|
{$form|raw}
|
|
</div>]]></template>
|
|
<template template_group="forums" template_name="forumTable" template_data="$table, $headers, $rows, $quickSearch" template_location="front" template_app="forums"><![CDATA[<div data-ips-hook="topicListTable" class='ipsBox ipsPull' data-baseurl='{$table->baseUrl}' data-resort='{$table->resortKey}' data-tableID='topics' {{if $table->dummyLoading}}data-dummyLoading{{endif}} data-controller='core.global.core.table{{if $table->canModerate()}},core.front.core.moderation{{endif}}'>
|
|
{{if $table->title}}
|
|
<h2 hidden>{$table->title}</h2>
|
|
{{endif}}
|
|
|
|
{{if $table->count > 0}}
|
|
<div class="ipsButtonBar ipsButtonBar--top">
|
|
<div data-role="tablePagination" class="ipsButtonBar__pagination" {{if $table->pages <= 1}}hidden{{endif}}>
|
|
{template="pagination" group="global" app="core" location="global" params="$table->baseUrl, $table->pages, $table->page, $table->limit, TRUE, $table->getPaginationKey()"}
|
|
</div>
|
|
<div class="ipsButtonBar__end">
|
|
<ul class="ipsDataFilters">
|
|
{{if \IPS\Member::loggedIn()->member_id}}
|
|
<li class="ipsResponsive_hidePhone">
|
|
<a href="{$table->baseUrl->setQueryString( array( 'do' => 'markRead', 'fromForum' => 1 ) )->csrf()}" class="ipsDataFilters__button" title='{lang="mark_forum_read_title"}' data-action='markForumRead'><i class="fa-solid fa-check"></i><span>{lang="mark_forum_read"}</span></a>
|
|
</li>
|
|
{{endif}}
|
|
{{if isset( $table->sortOptions ) and !empty( $table->sortOptions ) }}
|
|
<li data-ips-hook="sortOptions">
|
|
<a href="#elSortByMenu_menu" class="ipsDataFilters__button" id="elSortByMenu_{$table->uniqueId}" data-role='sortButton' data-ipsMenu data-ipsMenu-activeClass="ipsDataFilters__button--active" data-ipsMenu-selectable="radio"><span>{lang="sort_by"}</span><i class="fa-solid fa-caret-down"></i></a>
|
|
<ul class="ipsMenu ipsMenu_auto ipsMenu_withStem ipsMenu_selectable ipsHide" id="elSortByMenu_{$table->uniqueId}_menu">
|
|
{{$custom = TRUE;}}
|
|
{{foreach $table->sortOptions as $k => $col}}
|
|
<li class="ipsMenu_item {{if $col === $table->getSortByColumn()}}{{$custom = FALSE;}}ipsMenu_itemChecked{{endif}}" data-ipsMenuValue="{$col}" data-sortDirection='{$table->getSortDirection( $col )}'><a href="{$table->baseUrl->setQueryString( array( 'filter' => $table->filter, 'sortby' => $col, 'sortdirection' => $table->getSortDirection( $col ) ) )->setPage('page', 1)}" rel="nofollow">{lang="{$table->langPrefix}sort_{$k}"}</a></li>
|
|
{{endforeach}}
|
|
{{if $table->advancedSearch}}
|
|
<li class="ipsMenu_item {{if $custom}}ipsMenu_itemChecked{{endif}}" data-noSelect="true">
|
|
<a href='{$table->baseUrl->setQueryString( array( 'advancedSearchForm' => '1', 'filter' => $table->filter, 'sortby' => $table->sortBy, 'sortdirection' => $table->sortDirection ) )}' rel="nofollow" data-ipsDialog data-ipsDialog-title='{lang="custom_sort"}'>{lang="custom"}</a>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
</li>
|
|
{{endif}}
|
|
{{if !empty( $table->filters )}}
|
|
<li data-ips-hook="filters">
|
|
<a href="#elFilterByMenu_menu" class="ipsDataFilters__button" id="elFilterByMenu_{$table->uniqueId}" data-role='tableFilterMenu' data-ipsMenu data-ipsMenu-activeClass="ipsDataFilters__button--active" data-ipsMenu-selectable="radio"><span>{lang="filter_by"}</span><i class="fa-solid fa-caret-down"></i></a>
|
|
<ul class='ipsMenu ipsMenu_auto ipsMenu_withStem ipsMenu_selectable ipsHide' data-role="tableFilterMenu" id='elFilterByMenu_{$table->uniqueId}_menu'>
|
|
<li data-action="tableFilter" data-ipsMenuValue='' class='ipsMenu_item {{if !$table->filter}}ipsMenu_itemChecked{{endif}}'>
|
|
<a href='{$table->baseUrl->setQueryString( array( 'filter' => '', 'sortby' => $table->sortBy, 'sortdirection' => $table->sortDirection ) )->setPage('page', 1)}' rel="nofollow">{lang="{$table->langPrefix}all"}</a>
|
|
</li>
|
|
{{foreach $table->filters as $k => $q}}
|
|
<li data-action="tableFilter" data-ipsMenuValue='{$k}' class='ipsMenu_item {{if $k === $table->filter}}ipsMenu_itemChecked{{endif}}'>
|
|
<a href='{$table->baseUrl->setQueryString( array( 'filter' => $k, 'sortby' => $table->sortBy, 'sortdirection' => $table->sortDirection ) )->setPage('page', 1)}' rel="nofollow">{lang="{$table->langPrefix}{$k}"}</a>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</li>
|
|
{{endif}}
|
|
{{if $table->canModerate()}}
|
|
<li>
|
|
<a href="#elCheck_menu" class="ipsDataFilters__button" id="elCheck_{$table->uniqueId}" title='{lang="{$table->langPrefix}select_rows_tooltip"}' data-ipsTooltip data-ipsAutoCheck data-ipsAutoCheck-context="#elTable_{$table->uniqueId}" data-ipsMenu data-ipsMenu-activeClass="ipsDataFilters__button--active">
|
|
<span class="cAutoCheckIcon"><i class="fa-regular fa-square"></i></span> <i class="fa-solid fa-caret-down"></i>
|
|
<span class='ipsNotification' data-role='autoCheckCount'>0</span>
|
|
</a>
|
|
<ul class="ipsMenu ipsMenu_auto ipsMenu_withStem ipsHide" id="elCheck_{$table->uniqueId}_menu">
|
|
<li class="ipsMenu_title">{lang="{$table->langPrefix}select_rows"}</li>
|
|
<li class="ipsMenu_item" data-ipsMenuValue="all"><a href="#">{lang="all"}</a></li>
|
|
<li class="ipsMenu_item" data-ipsMenuValue="none"><a href="#">{lang="none"}</a></li>
|
|
{{if \count($table->getFilters())}}
|
|
<li class="ipsMenu_sep"><hr></li>
|
|
{{foreach $table->getFilters() as $filter}}
|
|
<li class="ipsMenu_item" data-ipsMenuValue="{$filter}"><a href="#">{lang="$filter"}</a></li>
|
|
{{endforeach}}
|
|
{{endif}}
|
|
</ul>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
{{if $table->canModerate()}}
|
|
<form action="{$table->baseUrl->csrf()}" method="post" data-role='moderationTools' data-ipsPageAction>
|
|
{{endif}}
|
|
{{if \count( $rows )}}
|
|
<i-data>
|
|
<ol class="ipsData {{if \IPS\Member::loggedIn()->getLayoutValue('forums_topic') == 'snippet'}}ipsData--snippet-topic-list{{else}}ipsData--table ipsData--entries ipsData--table-topic-list{{endif}} {{foreach $table->classes as $class}}{$class} {{endforeach}}" id='elTable_{$table->uniqueId}' data-role="tableRows">
|
|
{template="$table->rowsTemplate[1]" params="$table, $headers, $rows" object="$table->rowsTemplate[0]"}
|
|
</ol>
|
|
</i-data>
|
|
{{else}}
|
|
<div class='i-text-align_center ipsBox__padding'>
|
|
<p class='i-font-size_2 i-font-weight_500 i-margin-bottom_2'>{lang="no_topics_in_forum"}</p>
|
|
|
|
{{if $table->container()->can('add')}}
|
|
<a href='{$table->container()->url()->setQueryString( 'do', 'add' )}' rel="nofollow" class='ipsButton ipsButton--inherit ipsButton--large'>
|
|
{lang="submit_first_topic"}
|
|
</a>
|
|
{{endif}}
|
|
</div>
|
|
{{endif}}
|
|
{{if $table->canModerate()}}
|
|
<div class="ipsJS_hide ipsData__modBar" data-role="pageActionOptions">
|
|
<select name="modaction" data-role="moderationAction" class="ipsInput ipsInput--select i-basis_300">
|
|
{{if $table->canModerate('unhide')}}
|
|
<option value='approve' data-icon='check-circle'>{lang="approve"}</option>
|
|
{{endif}}
|
|
{{if $table->canModerate('feature') or $table->canModerate('unfeature')}}
|
|
<optgroup label="{lang="feature"}" data-icon='star' data-action='feature'>
|
|
{{if $table->canModerate('feature')}}
|
|
<option value='feature'>{lang="feature"}</option>
|
|
{{endif}}
|
|
{{if $table->canModerate('unhide')}}
|
|
<option value='unfeature'>{lang="unfeature"}</option>
|
|
{{endif}}
|
|
</optgroup>
|
|
{{endif}}
|
|
{{if $table->canModerate('pin') or $table->canModerate('unpin')}}
|
|
<optgroup label="{lang="pin"}" data-icon='thumb-tack' data-action='pin'>
|
|
{{if $table->canModerate('pin')}}
|
|
<option value='pin'>{lang="pin"}</option>
|
|
{{endif}}
|
|
{{if $table->canModerate('unpin')}}
|
|
<option value='unpin'>{lang="unpin"}</option>
|
|
{{endif}}
|
|
</optgroup>
|
|
{{endif}}
|
|
{{if $table->canModerate('hide') or $table->canModerate('unhide')}}
|
|
<optgroup label="{lang="hide"}" data-icon='eye' data-action='hide'>
|
|
{{if $table->canModerate('hide')}}
|
|
<option value='hide'>{lang="hide"}</option>
|
|
{{endif}}
|
|
{{if $table->canModerate('unhide')}}
|
|
<option value='unhide'>{lang="unhide"}</option>
|
|
{{endif}}
|
|
</optgroup>
|
|
{{endif}}
|
|
{{if $table->canModerate('lock') or $table->canModerate('unlock')}}
|
|
<optgroup label="{lang="lock"}" data-icon='lock' data-action='lock'>
|
|
{{if $table->canModerate('lock')}}
|
|
<option value='lock'>{lang="lock"}</option>
|
|
{{endif}}
|
|
{{if $table->canModerate('unlock')}}
|
|
<option value='unlock'>{lang="unlock"}</option>
|
|
{{endif}}
|
|
</optgroup>
|
|
{{endif}}
|
|
{{if $table->canModerate('move')}}
|
|
<option value='move' data-icon='arrow-right'>{lang="move"}</option>
|
|
{{endif}}
|
|
{{if $table->canModerate('split_merge')}}
|
|
<option value='merge' data-icon='level-up'>{lang="merge"}</option>
|
|
{{endif}}
|
|
{{if $table->canModerate('delete')}}
|
|
<option value='delete' data-icon='trash'>{lang="delete"}</option>
|
|
{{endif}}
|
|
{{if $table->canModerate( 'tag' )}}
|
|
<optgroup label='{lang="tag"}' data-icon='tag' data-action='tag'>
|
|
<option value='tag'>{lang="add_single_tag"}</option>
|
|
<option value='untag'>{lang="remove_single_tag"}</option>
|
|
</optgroup>
|
|
{{endif}}
|
|
{{if $table->savedActions}}
|
|
<optgroup label="{lang="saved_actions"}" data-icon='tasks' data-action='saved_actions'>
|
|
{{foreach $table->savedActions as $k => $v}}
|
|
<option value='savedAction-{$k}'>{$v}</option>
|
|
{{endforeach}}
|
|
</optgroup>
|
|
{{endif}}
|
|
</select>
|
|
<button type="submit" class="ipsButton ipsButton--primary">{lang="submit"}</button>
|
|
</div>
|
|
</form>
|
|
{{endif}}
|
|
<div data-ips-hook="pagination" class="ipsButtonBar ipsButtonBar--bottom" data-role="tablePagination" {{if $table->pages <= 1}}hidden{{endif}}>
|
|
{template="pagination" group="global" app="core" location="global" params="$table->baseUrl, $table->pages, $table->page, $table->limit, TRUE, $table->getPaginationKey()"}
|
|
</div>
|
|
</div>]]></template>
|
|
<template template_group="forums" template_name="popularQuestionRow" template_data="$question, $forum" template_location="front" template_app="forums"><![CDATA[<!-- v5 todo: Is this template file used? -->
|
|
<style>*{color: purple !important; }</style>
|
|
{{$iposted = $forum->contentPostedIn( null, array( $question->tid ) );}}
|
|
{{if !$question->mapped('moved_to')}}
|
|
<li class="ipsData__item cForumQuestion {{if $question->hidden()}}ipsModerated{{endif}}" {{if $question->unread()}}data-ips-unread{{endif}}>
|
|
<div class='ipsData__icon'>
|
|
{{if $question->topic_answered_pid}}
|
|
<span title='{lang="answered"}' class='cBestAnswerIndicator' data-ipsTooltip>
|
|
<i class='fa-solid fa-check'></i>
|
|
</span>
|
|
{{else}}
|
|
<span title='{lang="awaiting_answer"}' class='cBestAnswerIndicator cBestAnswerIndicator_off' data-ipsTooltip>
|
|
<i class='fa-solid fa-question'></i>
|
|
</span>
|
|
{{endif}}
|
|
</div>
|
|
<div class='ipsData__main'>
|
|
<h4 class='ipsData__title _container'>
|
|
<span class=''>
|
|
{{if $question->locked()}}
|
|
<i class='fa-solid fa-lock' data-ipsTooltip title='{lang="topic_locked"}'></i>
|
|
{{endif}}
|
|
{{if $question->unread()}}
|
|
<a href='{$question->url( 'getNewComment' )}' title='{lang="first_unread_post"}' data-ipsTooltip class='ipsIndicator {{if \in_array( $question->tid, $iposted )}}ipsIndicator--participated{{endif}}' data-ips-hook="unreadIcon"></a>
|
|
{{else}}
|
|
<span class='ipsIndicator ipsIndicator--read {{if \in_array( $question->tid, $iposted )}}ipsIndicator--participated{{endif}}'></span>
|
|
{{endif}}
|
|
<span>
|
|
{{foreach $question->badges() as $badge}}{$badge|raw}{{endforeach}}
|
|
</span>
|
|
{{if $question->prefix()}}
|
|
{template="prefix" group="global" app="core" params="$question->prefix( TRUE ), $question->prefix()"}
|
|
{{endif}}
|
|
<a href='{$question->url()}'>
|
|
{{if $question->mapped('title')}}{$question->mapped('title')}{{else}}<em class="i-color_soft">{lang="content_deleted"}</em>{{endif}}
|
|
</a>
|
|
</span>
|
|
</h4>
|
|
<div class='ipsData__meta'>
|
|
<p>{lang="ask_byline" htmlsprintf="$question->author()->link( NULL, NULL, $question->isAnonymous() ), \IPS\DateTime::ts( $question->start_date )->html( false )"}</p>
|
|
</div>
|
|
{{if \count( $question->tags() )}}
|
|
<p>{template="tags" group="global" app="core" params="$question->tags()"}</p>
|
|
{{endif}}
|
|
</div>
|
|
<div class='i-basis_80 i-text-align_center cForumQuestion_stat'>
|
|
<span>{{if $question->question_rating}}{$question->question_rating}{{else}}0{{endif}}</span>
|
|
<span class='i-color_soft'>{lang="votes_no_number" pluralize="$question->question_rating"}</span>
|
|
</div>
|
|
<div class='i-basis_80 i-text-align_center cForumQuestion_stat'>
|
|
{{foreach $question->stats(FALSE) AS $k => $v}}
|
|
{{if $k == 'forums_comments' OR $k == 'answers_no_number'}}
|
|
<span>{number="$v"}</span>
|
|
<span class='i-color_soft'>{lang="answers_no_number" pluralize="$v"}</span>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
</div>
|
|
</li>
|
|
{{endif}}]]></template>
|
|
<template template_group="forums" template_name="qaForum" template_data="$table, $popularQuestions, $newQuestions, $featuredTopic, $forum" template_location="front" template_app="forums"><![CDATA[
|
|
{{if $popularQuestions && $newQuestions}}
|
|
<div class='ipsBox i-margin-bottom_4'>
|
|
<h2 class='ipsBox__header ipsHide'>{lang="explore_questions_title"}</h2>
|
|
<div class="ipsTabs" id="elQuestionsTabs" data-ipsTabBar data-ipsTabBar-contentarea="#elQuestionsTabsContent">
|
|
<ul role="tablist">
|
|
<li>
|
|
<a href="#elPopularQuestions" role="tab" id="elPopularQuestions" class="ipsTabs__tab {{if \count( $popularQuestions ) || !\count( $popularQuestions ) && !\count( $newQuestions )}}ipsTabs__tab--active{{endif}}" role="tab" aria-selected="{{if \count( $popularQuestions ) || !\count( $popularQuestions ) && !\count( $newQuestions )}}true{{else}}false{{endif}}">
|
|
{lang="popular_questions_title"}
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href="#elNewQuestions" id="elNewQuestions" role="tab" class="ipsTabs__tab {{if !\count( $popularQuestions ) && \count( $newQuestions )}}ipsTabs__tab--active{{endif}}" role="tab" aria-selected="{{if !\count( $popularQuestions ) && \count( $newQuestions )}}true{{else}}false{{endif}}">
|
|
{{if \IPS\Settings::i()->forums_new_questions}}{lang="new_questions_title_no_answer"}{{else}}{lang="new_questions_title_no_best"}{{endif}}
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
{template="tabScrollers" app="core" group="global" location="global"}
|
|
</div>
|
|
<section id='elQuestionsTabsContent'>
|
|
<div id="ipsTabs_elQuestionsTabs_elPopularQuestions_panel" class="ipsTabs__panel" aria-labelledby="elPopularQuestions">
|
|
{{if \count( $popularQuestions )}}
|
|
<!-- v5 todo: I think this entire template file is no longer needed.. -->
|
|
<i-data>
|
|
<ol class="ipsData ipsData--table cForumTopicTable cForumQuestions cTopicList" id='elTable_popularQuestions' data-role="tableRows">
|
|
{{foreach $popularQuestions as $question}}
|
|
{template="popularQuestionRow" params="$question, $forum" group="forums"}
|
|
{{endforeach}}
|
|
</ol>
|
|
</i-data>
|
|
{{else}}
|
|
<div class='i-text-align_center i-color_soft i-padding_3'>
|
|
<p class='i-font-size_2'>{lang="no_popular_questions"}</p>
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
<div id="ipsTabs_elQuestionsTabs_elNewQuestions_panel" class="ipsTabs__panel" aria-labelledby="elNewQuestions">
|
|
{{if \count( $newQuestions )}}
|
|
<i-data>
|
|
<ol class="ipsData ipsData--table cForumTopicTable cForumQuestions cTopicList" id='elTable_newQuestions' data-role="tableRows">
|
|
{{foreach $newQuestions as $question}}
|
|
{template="popularQuestionRow" params="$question, $forum" group="forums"}
|
|
{{endforeach}}
|
|
</ol>
|
|
</i-data>
|
|
{{else}}
|
|
<div class='i-text-align_center i-color_soft i-padding_3'>
|
|
<p class='i-font-size_2'>{lang="no_new_questions"}</p>
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
</section>
|
|
</div>
|
|
{{else}}
|
|
{{if $popularQuestions}}
|
|
<section class='ipsBox i-margin-bottom_4'>
|
|
<h2 class='ipsBox__header'>{lang="popular_questions_title"}</h2>
|
|
{{if \count( $popularQuestions )}}
|
|
<i-data>
|
|
<ol class="ipsData ipsData--table cForumTopicTable" id='elTable_' data-role="tableRows">
|
|
{{foreach $popularQuestions as $question}}
|
|
{template="popularQuestionRow" params="$question, $forum" group="forums"}
|
|
{{endforeach}}
|
|
</ol>
|
|
</i-data>
|
|
{{else}}
|
|
<div class='i-text-align_center i-color_soft i-padding_3'>
|
|
<p class='i-font-size_2'>{lang="no_popular_questions"}</p>
|
|
</div>
|
|
{{endif}}
|
|
</section>
|
|
{{endif}}
|
|
{{if $newQuestions}}
|
|
<section class='ipsBox i-margin-bottom_4'>
|
|
<h2 class='ipsBox__header'>{{if \IPS\Settings::i()->forums_new_questions}}{lang="new_questions_title_no_answer"}{{else}}{lang="new_questions_title_no_best"}{{endif}}</h2>
|
|
{{if \count( $newQuestions )}}
|
|
<i-data>
|
|
<ol class="ipsData ipsData--table cForumTopicTable" id='elTable_' data-role="tableRows">
|
|
{{foreach $newQuestions as $question}}
|
|
{template="popularQuestionRow" params="$question, $forum" group="forums"}
|
|
{{endforeach}}
|
|
</ol>
|
|
</i-data>
|
|
{{else}}
|
|
<div class='i-text-align_center i-color_soft i-padding_3'>
|
|
<p class='i-font-size_2'>{lang="no_new_questions"}</p>
|
|
</div>
|
|
{{endif}}
|
|
</section>
|
|
{{endif}}
|
|
{{endif}}
|
|
{$table|raw}]]></template>
|
|
<template template_group="forums" template_name="questionRow" template_data="$table, $headers, $rows" template_location="front" template_app="forums"><![CDATA[<!-- v5 todo: Is this template file used? -->
|
|
<style>*{color: gold !important; }</style>
|
|
{{$rowIds = array();}}
|
|
{{foreach $rows as $row}}
|
|
{{$idField = $row::$databaseColumnId;}}
|
|
{{$rowIds[] = $row->$idField;}}
|
|
{{endforeach}}
|
|
{{if \count( $rows )}}
|
|
{{$rowCount=1; $adShown=0;}}
|
|
{{foreach $rows as $row}}
|
|
{{if $advertisement = \IPS\core\Advertisement::loadByLocation( 'ad_forum_listing', $rowCount, $adShown )}}
|
|
<li class="ipsData__item">
|
|
{$advertisement|raw}
|
|
{{$adShown++;}}
|
|
</li>
|
|
{{endif}}
|
|
{{$rowCount++;}}
|
|
{{$idField = $row::$databaseColumnId;}}
|
|
{{if $row->mapped('moved_to')}}
|
|
{{if $movedTo = $row->movedTo()}}
|
|
<li class="ipsData__item {{if \IPS\forums\Forum::getMemberListView() == 'snippet'}}ipsTopicSnippet ipsQuestionSnippet{{endif}}">
|
|
<div class='ipsData__icon i-text-align_center'>
|
|
<i class="fa-solid fa-arrow-left i-font-size_2"></i>
|
|
</div>
|
|
<div class='ipsData__main'>
|
|
<h4 class='ipsData__title'>
|
|
<span class=''>
|
|
<em><a href='{$movedTo->url()}' title='{lang="go_to_new_location"}'>{$row->mapped('title')}</a></em>
|
|
</span>
|
|
</h4>
|
|
<div class='ipsData__meta'>
|
|
{{if isset( $row::$databaseColumnMap['status'] )}}
|
|
{{$statusField = $row::$databaseColumnMap['status'];}}
|
|
{{if $row->$statusField == 'merged'}}
|
|
<p>{lang="question_merged_to" sprintf="$movedTo->url(), $movedTo->mapped('title')"}</p>
|
|
{{else}}
|
|
<p>{lang="question_moved_to" sprintf="$movedTo->container()->url(), $movedTo->container()->_title"}</p>
|
|
{{endif}}
|
|
{{else}}
|
|
<p>{lang="question_moved_to" sprintf="$movedTo->container()->url(), $movedTo->container()->_title"}</p>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
{{if $table->canModerate()}}
|
|
<div class='ipsData__mod'>
|
|
<input type='checkbox' data-role='moderation' name="moderate[{$row->$idField}]" data-actions="{expression="implode( ' ', $table->multimodActions( $row ) )"}" data-state='{{if $row->mapped('pinned')}}pinned{{endif}} {{if $row->mapped('featured')}}featured{{endif}}' class="ipsInput ipsInput--toggle">
|
|
</div>
|
|
{{endif}}
|
|
</li>
|
|
{{endif}}
|
|
{{else}}
|
|
<li class="ipsData__item {{if \IPS\forums\Forum::getMemberListView() == 'snippet'}}ipsTopicSnippet ipsQuestionSnippet{{endif}} {{if method_exists( $row, 'tableClass' ) && $row->tableClass()}}ipsData__item_{$row->tableClass()}{{endif}} {{if $row->hidden()}}ipsModerated{{endif}} cForumQuestion" data-rowID='{$row->$idField}' {{if $row->unread()}}data-ips-unread{{endif}}>
|
|
<div class='ipsData__icon'>
|
|
{{if $row->topic_answered_pid}}
|
|
<span title='{lang="answered"}' class='cBestAnswerIndicator' data-ipsTooltip>
|
|
<i class='fa-solid fa-check'></i>
|
|
</span>
|
|
{{else}}
|
|
<span title='{lang="awaiting_answer"}' class='cBestAnswerIndicator cBestAnswerIndicator_off' data-ipsTooltip>
|
|
<i class='fa-solid fa-question'></i>
|
|
</span>
|
|
{{endif}}
|
|
</div>
|
|
<div class='ipsData__main'>
|
|
<h4 class='ipsData__title'>
|
|
<span class=''>
|
|
{{if $row->locked()}}
|
|
<span><i class='fa-solid fa-lock' data-ipsTooltip title='{lang="topic_locked"}'></i></span>
|
|
{{endif}}
|
|
{{if $row->unread()}}
|
|
<a href='{$row->url( 'getNewComment' )}' title='{lang="first_unread_post"}' data-ipsTooltip class='ipsIndicator {{if \in_array( $row->$idField, $table->contentPostedIn )}}ipsIndicator--participated{{endif}}' data-ips-hook="unreadIcon"></span>
|
|
</a>
|
|
{{else}}
|
|
<span class='ipsIndicator ipsIndicator--read {{if \in_array( $row->$idField, $table->contentPostedIn )}}ipsIndicator--participated{{endif}}'></span>
|
|
{{endif}}
|
|
|
|
<span>{{foreach $row->badges() as $badge}}{$badge|raw}{{endforeach}}</span>
|
|
|
|
{{if $row->prefix()}}
|
|
<span>{template="prefix" group="global" app="core" params="$row->prefix( TRUE ), $row->prefix()"}</span>
|
|
{{endif}}
|
|
|
|
<a href='{$row->url( "getPrefComment" )}' title='{{if $row->mapped('title')}}{$row->mapped('title')}{{else}}{lang="content_deleted"}{{endif}} {{if $row->canEdit()}}{lang="click_hold_edit"}{{endif}}' {{if $row->tableHoverUrl and $row->canView()}}data-ipsHover data-ipsHover-target='{$row->url()->setQueryString('preview', 1)}' data-ipsHover-timeout='1.5'{{endif}} {{if $row->canEdit()}} data-role="editableTitle"{{endif}}>
|
|
<span>
|
|
{{if $row->mapped('title')}}{$row->mapped('title')}{{else}}<em class="i-color_soft">{lang="content_deleted"}</em>{{endif}}
|
|
</span>
|
|
</a>
|
|
</span>
|
|
</h4>
|
|
{{if \IPS\forums\Forum::getMemberListView() == 'snippet'}}
|
|
<div class='ipsTopicSnippet__snippet i-link-color_inherit'>
|
|
<p>{$row->firstComment->snippet(680)}</p>
|
|
</div>
|
|
{{endif}}
|
|
<div class='ipsData__meta'>
|
|
<p>
|
|
<span>
|
|
{lang="ask_byline_itemprop" htmlsprintf="$row->author()->link( NULL, NULL, $row->isAnonymous() ), \IPS\DateTime::ts( $row->start_date )->html( false )"}
|
|
</span>
|
|
{{if \IPS\Request::i()->controller != 'forums'}}
|
|
{lang="in"} <a href="{$row->container()->url()}">{$row->container()->_title}</a>
|
|
{{endif}}
|
|
</p>
|
|
{{if \count( $row->tags() )}}
|
|
<div>{template="tags" group="global" app="core" params="$row->tags()"}</div>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
<div class='i-basis_80 i-text-align_center cForumQuestion_stat'>
|
|
<span>{{if $row->question_rating}}{$row->question_rating}{{else}}0{{endif}}</span>
|
|
<span class='i-color_soft'>{lang="votes_no_number" pluralize="$row->question_rating"}</span>
|
|
</div>
|
|
<div class='i-basis_80 i-text-align_center cForumQuestion_stat'>
|
|
{{foreach $row->stats(FALSE) AS $k => $v}}
|
|
{{if $k == 'forums_comments' OR $k == 'answers_no_number'}}
|
|
<span>{number="$v"}</span>
|
|
<span class='i-color_soft'>
|
|
{lang="answers_no_number" pluralize="$v"}
|
|
{{if \IPS\forums\Topic::modPermission( 'unhide', NULL, $row->container() ) AND $unapprovedComments = $row->mapped('unapproved_comments')}}
|
|
<a href='{$row->url()->setQueryString( 'queued_posts', 1 )}' class='i-color_warning i-font-size_-2' data-ipsTooltip title='{lang="queued_posts_badge" pluralize="$row->topic_queuedposts"}'><i class='fa-solid fa-triangle-exclamation'></i> <strong>{$unapprovedComments}</strong></a>
|
|
{{endif}}
|
|
</span>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
</div>
|
|
{{if $table->canModerate()}}
|
|
<div class='ipsData__mod'>
|
|
<input type='checkbox' data-role='moderation' name="moderate[{$row->$idField}]" data-actions="{expression="implode( ' ', $table->multimodActions( $row ) )"}" data-state='{{if $row->tableStates()}}{$row->tableStates()}{{endif}}' class="ipsInput ipsInput--toggle">
|
|
</div>
|
|
{{endif}}
|
|
</li>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
{{endif}}]]></template>
|
|
<template template_group="forums" template_name="topicHover" template_data="$topic, $overviews" template_location="front" template_app="forums"><![CDATA[
|
|
<div class='cTopicHovercard' data-controller='forums.front.forum.hovercard' data-topicID='{$topic->tid}'>
|
|
{{if \count( $overviews ) > 1}}
|
|
<div class="ipsTabs ipsTabs_small" id="elTopic_{$topic->tid}" data-ipsTabBar data-ipsTabBar-contentarea="#elTopic_{$topic->tid}_content">
|
|
<ul role="tablist">
|
|
{{foreach $overviews as $tabID => $tabData}}
|
|
<li>
|
|
<a href="#ipsTabs_elTopic_{$topic->tid}_elTopic_{$topic->tid}_{$tabID}_panel" id="elTopic_{$topic->tid}_{$tabID}" class="ipsTabs__tab" role="tab" aria-selected="{{if $tabID == 'firstPost'}}true{{else}}false{{endif}}">{lang="$tabData[0]"}</a>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
{template="tabScrollers" app="core" group="global" location="global"}
|
|
</div>
|
|
<div id='elTopic_{$topic->tid}_content' class='ipsTabs__panels ipsTabs__panels--padded cTopicHovercard_container ipsScrollbar'>
|
|
{{else}}
|
|
<div class='i-padding_3 cTopicHovercard_container ipsScrollbar'>
|
|
{{endif}}
|
|
|
|
{{foreach $overviews as $tabID => $tabData}}
|
|
{{if \count( $overviews ) > 1}}
|
|
<div id='ipsTabs_elTopic_{$topic->tid}_elTopic_{$topic->tid}_{$tabID}_panel' class='ipsTabs__panel'>
|
|
{{endif}}
|
|
<div class='ipsPhotoPanel'>
|
|
{template="userPhoto" group="global" app="core" params="$tabData[1]->author(), 'fluid'"}
|
|
<div class='ipsPhotoPanel__text'>
|
|
<div class='ipsPhotoPanel__primary'>
|
|
{$tabData[1]->author()->link( NULL, NULL, $tabData[1]->isAnonymous() )|raw}
|
|
</div>
|
|
<div class='ipsPhotoPanel__secondary'>
|
|
{datetime="$tabData[1]->mapped('date')"}
|
|
{{if $tabData[1]->item()->unread() }}
|
|
· <a href='{$tabData[1]->item()->url('markRead')->csrf()}' title='{lang="mark_topic_read"}' data-action='markTopicRead'><i class='fa-solid fa-check'></i> {lang="mark_topic_read"}</a>
|
|
{{endif}}
|
|
{{if $tabData[1]->canReportOrRevoke() === TRUE}}
|
|
· <a href='{$tabData[1]->url('report')}' {{if member.member_id or \IPS\Helpers\Form\Captcha::supportsModal()}}data-ipsDialog data-ipsDialog-remoteSubmit data-ipsDialog-size='medium' data-ipsDialog-flashMessage='{lang="report_submit_success"}' data-ipsDialog-title="{lang="report_post"}"{{endif}} data-action='reportComment' title='{lang="report_post"}'>{lang="report_post"}</a>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<hr class='ipsHr'>
|
|
|
|
<div class='ipsRichText' data-controller='core.front.core.lightboxedImages'>{$tabData[1]->content()|raw}</div>
|
|
{{if \count( $overviews ) > 1}}
|
|
</div>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
</div>
|
|
{{if \IPS\Settings::i()->core_datalayer_enabled}}
|
|
<script>
|
|
if ( IpsDataLayerConfig && !window.IpsDataLayerConfig && IpsDataLayerConfig._events.content_view.enabled ) {
|
|
$('body').trigger( 'ipsDataLayer', {
|
|
_key: 'content_view',
|
|
_properties: {expression="json_encode(array_replace($topic->getDataLayerProperties(), ['view_location' => 'hovercard', 'page_number' => null]))" raw="true"}
|
|
} );
|
|
}
|
|
</script>
|
|
{{endif}}
|
|
</div>]]></template>
|
|
<template template_group="forums" template_name="topicRow" template_data="$table, $headers, $rows" template_location="front" template_app="forums"><![CDATA[{{$rowIds = array();}}
|
|
{{foreach $rows as $row}}
|
|
{{$idField = $row::$databaseColumnId;}}
|
|
{{$rowIds[] = $row->$idField;}}
|
|
{{endforeach}}
|
|
{{if \count( $rows )}}
|
|
{{$rowCount=1; $adShown=0;}}
|
|
{{foreach $rows as $row}}
|
|
{{if $advertisement = \IPS\core\Advertisement::loadByLocation( 'ad_forum_listing', $rowCount, $adShown )}}
|
|
<li class="ipsData__item ipsData__item--advertisement">
|
|
{$advertisement|raw}
|
|
{{$adShown++;}}
|
|
</li>
|
|
{{endif}}
|
|
{{$rowCount++;}}
|
|
{{$idField = $row::$databaseColumnId;}}
|
|
{{if $row->mapped('moved_to')}}
|
|
{{if $movedTo = $row->movedTo() AND $movedTo->container()->can('view')}}
|
|
<li class="ipsData__item ipsData__item--moved">
|
|
<a href='{$movedTo->url()}' class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{$row->mapped('title')}</span></a>
|
|
<div class='ipsData__icon ipsData__icon--indicator'>
|
|
<i class="fa-solid fa-arrow-left"></i>
|
|
</div>
|
|
<div class='ipsData__content'>
|
|
<div class='ipsData__main'>
|
|
<div class='ipsData__title'>
|
|
<h4>
|
|
<a href='{$movedTo->url()}' title='{lang="go_to_new_location"}'>{$row->mapped('title')}</a>
|
|
</h4>
|
|
</div>
|
|
<p class='ipsData__meta'>
|
|
{{if isset( $row::$databaseColumnMap['status'] )}}
|
|
{{$statusField = $row::$databaseColumnMap['status'];}}
|
|
{{if $row->$statusField == 'merged'}}
|
|
{lang="topic_merged_to" sprintf="$movedTo->url( 'getPrefComment' ), $movedTo->mapped('title')"}
|
|
{{else}}
|
|
{lang="topic_moved_to" sprintf="$movedTo->container()->url(), $movedTo->container()->_title"}
|
|
{{endif}}
|
|
{{else}}
|
|
{lang="topic_moved_to" sprintf="$movedTo->container()->url(), $movedTo->container()->_title"}
|
|
{{endif}}
|
|
</p>
|
|
</div>
|
|
</div>
|
|
{{if $table->canModerate()}}
|
|
<div class='ipsData__mod'>
|
|
<input type='checkbox' data-role='moderation' name="moderate[{$row->$idField}]" data-actions="{{if $row->mapped('featured')}}unfeature{{endif}} {{if $row->mapped('pinned')}}unpin{{endif}} delete" data-state='{{if $row->mapped('pinned')}}pinned{{endif}} {{if $row->mapped('featured')}}featured{{endif}}' class="ipsInput ipsInput--toggle">
|
|
</div>
|
|
{{endif}}
|
|
</li>
|
|
{{endif}}
|
|
{{else}}
|
|
<li data-ips-hook="topicRow" class="ipsData__item {{if $row->groupsPosted}}ipsData__item--highlighted{{endif}} {{if method_exists( $row, 'tableClass' ) && $row->tableClass()}}ipsData__item--{$row->tableClass()}{{endif}} {{if $row->hidden() or $row->isFutureDate()}}ipsModerated{{endif}} {{if $row->isFutureDate()}}ipsModerated--future{{endif}} {$row->ui( 'css' )} {{if $row->isAssignedToMember()}}ipsData__item--assigned{{endif}}" data-rowID='{$row->$idField}' data-location='{{if isset($row->locationHash)}}{$row->locationHash}{{endif}}' data-controller='cloud.front.realtime.forumsTopicRow' {{if $row->unread()}}data-ips-unread{{else}}data-ips-read{{endif}} {$row->ui( 'dataAttributes' )}>
|
|
{{if $row->mapped('title') or $row->mapped('title') == 0}}<a href='{$row->url( "getPrefComment" )}' class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{$row->mapped('title')}</span></a>{{endif}}
|
|
{{if member.member_id and $row->unread()}}
|
|
<a href='{$row->url( "getNewComment" )}' class="ipsData__icon" aria-label='{lang="first_unread_post"}' data-ipsTooltip data-ips-hook="unreadIcon">
|
|
<span class="ipsUserPhoto">
|
|
<img src="{$row->author()->photo}" alt="" loading="lazy">
|
|
</span>
|
|
{{if $row->author() != \IPS\Member::loggedIn() and \in_array( $row->$idField, $table->contentPostedIn )}}
|
|
<span class="ipsUserPhoto">
|
|
<img src='{expression="\IPS\Member::loggedIn()->photo"}' alt='' loading="lazy">
|
|
</span>
|
|
{{endif}}
|
|
</a>
|
|
{{else}}
|
|
<div class="ipsData__icon">
|
|
<span class="ipsUserPhoto">
|
|
<img src="{$row->author()->photo}" alt="" loading="lazy">
|
|
</span>
|
|
{{if $row->author() != \IPS\Member::loggedIn() and \in_array( $row->$idField, $table->contentPostedIn )}}
|
|
<span class="ipsUserPhoto">
|
|
<img src='{expression="\IPS\Member::loggedIn()->photo"}' alt='' loading="lazy">
|
|
</span>
|
|
{{endif}}
|
|
</div>
|
|
{{endif}}
|
|
<div class='ipsData__content'>
|
|
<div class='ipsData__main'>
|
|
<div class='ipsData__title'>
|
|
{{if member.member_id and $row->unread()}}
|
|
<a href='{$row->url( "getNewComment" )}' class="ipsIndicator {{if \in_array( $row->$idField, $table->contentPostedIn )}}ipsIndicator--participated{{endif}}" aria-label='{lang="first_unread_post"}' data-ipsTooltip data-ips-hook="topicIcon"></a>
|
|
{{endif}}
|
|
{{if $row->prefix()}}
|
|
{template="prefix" group="global" app="core" params="$row->prefix( TRUE ), $row->prefix()"}
|
|
{{endif}}
|
|
<h4 data-ips-hook="title">
|
|
<a href='{$row->url( "getPrefComment" )}' title='{{if $row->mapped('title')}}{$row->mapped('title')}{{else}}{lang="content_deleted"}{{endif}} {{if $row->canEdit()}}{lang="click_hold_edit"}{{endif}}' {{if $row->tableHoverUrl and $row->canView()}} data-ipsHover data-ipsHover-target='{$row->url()->setQueryString('preview', 1)}' data-ipsHover-timeout='1.0'{{endif}}{{if $row->canEdit()}} data-role="editableTitle"{{endif}}>
|
|
<span>
|
|
{{if $row->mapped('title') or $row->mapped('title') == 0}}{$row->mapped('title')}{{else}}<em class="i-color_soft">{lang="content_deleted"}</em>{{endif}}
|
|
</span>
|
|
</a>
|
|
</h4>
|
|
{{if $row->commentPageCount() > 1}}
|
|
{$row->commentPagination( array(), 'miniPagination' )|raw}
|
|
{{endif}}
|
|
{template="assignmentBadge" app="core" group="global" params="$row, ''"}
|
|
<div class="ipsBadges">{{foreach $row->badges() as $badge}}{$badge|raw}{{endforeach}}</div>
|
|
</div>
|
|
<div class='ipsData__meta'>
|
|
{lang="byline_nodate" htmlsprintf="$row->author()->link( NULL, NULL, $row->isAnonymous() )"},
|
|
<a href='{$row->url()}'>{datetime="$row->mapped('date')"}</a>
|
|
{{if !\in_array( \IPS\Dispatcher::i()->controller, array( 'forums', 'index' ) )}}
|
|
{lang="in"} <a href="{$row->container()->url()}">{$row->container()->_title}</a>
|
|
{{endif}}
|
|
</div>
|
|
{{if \count( $row->tags() )}}
|
|
{template="tags" group="global" app="core" params="$row->tags(), true"}
|
|
{{endif}}
|
|
</div>
|
|
<span data-role="activeUsers"></span>
|
|
{{if $row->groupsPosted}}
|
|
{template="groupPostedBadges" group="global" app="core" location="front" params="$row->groupsPosted, 'topic_posted_in_groups'"}
|
|
{{endif}}
|
|
<div class="ipsData__extra">
|
|
<ul data-ips-hook="stats" class='ipsData__stats'>
|
|
{{foreach $row->stats(FALSE) as $k => $v}}
|
|
<li {{if $k == 'num_views'}} {{elseif \in_array( $k, $row->hotStats )}}class="ipsData__stats-hot" data-text='{lang="hot_item"}' data-ipsTooltip title='{lang="hot_item_desc"}'{{endif}} data-statType='{$k}' {{if $v === 0}}data-v="0"{{endif}}>
|
|
<span class='ipsData__stats-icon' data-stat-value='{number="$v" format="short"}' aria-hidden="true" data-ipstooltip title='{number="$v" format="short"} {lang="{$k}" pluralize="$v" format="short"}'></span>
|
|
<span class='ipsData__stats-label'>{number="$v" format="short"} {lang="{$k}" pluralize="$v" format="short"}</span>
|
|
{{if ( $k == 'forums_comments' OR $k == 'answers_no_number' ) && \IPS\forums\Topic::modPermission( 'unhide', NULL, $row->container() ) AND $unapprovedComments = $row->mapped('unapproved_comments')}}
|
|
<a href='{$row->url()->setQueryString( 'queued_posts', 1 )}' class='i-color_warning i-font-size_-2' data-ipsTooltip title='{lang="queued_posts_badge" pluralize="$row->topic_queuedposts"}'><i class='fa-solid fa-triangle-exclamation'></i> <strong>{$unapprovedComments}</strong></a>
|
|
{{endif}}
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
<div data-ips-hook="latestData" class="ipsData__last">
|
|
{{if $row->mapped('num_comments')}}
|
|
{template="userPhoto" app="core" group="global" params="$row->lastCommenter(), 'fluid'"}
|
|
{{else}}
|
|
{template="userPhoto" app="core" group="global" params="$row->author(), 'fluid'"}
|
|
{{endif}}
|
|
<div class="ipsData__last-text">
|
|
<div class="ipsData__last-primary">
|
|
{{if $row->mapped('num_comments')}}
|
|
{{if $row->mapped('last_comment_anon')}}
|
|
{template="userLink" app="core" group="global" params="$row->author(), NULL, NULL, TRUE"}
|
|
{{else}}
|
|
{$row->lastCommenter()->link()|raw}
|
|
{{endif}}
|
|
{{else}}
|
|
{$row->author()->link( NULL, NULL, $row->isAnonymous() )|raw}
|
|
{{endif}}
|
|
</div>
|
|
<div class="ipsData__last-secondary">
|
|
<a href='{$row->url( 'getLastComment' )}' title='{lang="get_last_post"}'>
|
|
{{if $row->mapped('last_comment')}}{datetime="$row->mapped('last_comment')"}{{else}}{datetime="$row->mapped('date')"}{{endif}}
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{{if $table->canModerate()}}
|
|
<div class='ipsData__mod'>
|
|
<label class='ipsInvisible' for='mod-checkbox-{$row->$idField}'>{lang="moderator_checkbox"}</label>
|
|
<input type='checkbox' id='mod-checkbox-{$row->$idField}' class='ipsInput ipsInput--toggle' data-role='moderation' name="moderate[{$row->$idField}]" data-actions="{expression="implode( ' ', $table->multimodActions( $row ) )"}" data-state='{{if $row->tableStates()}}{$row->tableStates()}{{endif}}'>
|
|
</div>
|
|
{{endif}}
|
|
</li>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
{{endif}}]]></template>
|
|
<template template_group="forums" template_name="topicRowSnippet" template_data="$table, $headers, $rows" template_location="front" template_app="forums"><![CDATA[{{$rowIds = array();}}
|
|
{{foreach $rows as $row}}
|
|
{{$idField = $row::$databaseColumnId;}}
|
|
{{$rowIds[] = $row->$idField;}}
|
|
{{endforeach}}
|
|
{{if \count( $rows )}}
|
|
{{$rowCount=1; $adShown=0;}}
|
|
{{foreach $rows as $row}}
|
|
{{if $advertisement = \IPS\core\Advertisement::loadByLocation( 'ad_forum_listing', $rowCount, $adShown )}}
|
|
<li class="ipsData__item ipsData__item--advertisement">
|
|
{$advertisement|raw}
|
|
{{$adShown++;}}
|
|
</li>
|
|
{{endif}}
|
|
{{$rowCount++;}}
|
|
{{$idField = $row::$databaseColumnId;}}
|
|
{{if $row->mapped('moved_to')}}
|
|
{{if $movedTo = $row->movedTo() AND $movedTo->container()->can('view')}}
|
|
<li class="ipsData__item ipsData__item--snippet">
|
|
<a href="{$movedTo->url()}" class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{$row->mapped('title')}</span></a>
|
|
<div class='ipsData__icon ipsData__icon--indicator'>
|
|
<i class="fa-solid fa-arrow-left"></i>
|
|
</div>
|
|
<div class='ipsData__content'>
|
|
<div class='ipsData__main'>
|
|
<div class='ipsData__title'>
|
|
<h4>
|
|
<a href='{$movedTo->url()}' title='{lang="go_to_new_location"}'>{$row->mapped('title')}</a>
|
|
</h4>
|
|
</div>
|
|
<p class='ipsData__meta'>
|
|
{{if isset( $row::$databaseColumnMap['status'] )}}
|
|
{{$statusField = $row::$databaseColumnMap['status'];}}
|
|
{{if $row->$statusField == 'merged'}}
|
|
{lang="topic_merged_to" sprintf="$movedTo->url( 'getPrefComment' ), $movedTo->mapped('title')"}
|
|
{{else}}
|
|
{lang="topic_moved_to" sprintf="$movedTo->container()->url(), $movedTo->container()->_title"}
|
|
{{endif}}
|
|
{{else}}
|
|
{lang="topic_moved_to" sprintf="$movedTo->container()->url(), $movedTo->container()->_title"}
|
|
{{endif}}
|
|
</p>
|
|
</div>
|
|
</div>
|
|
{{if $table->canModerate()}}
|
|
<div class='ipsData__mod'>
|
|
<input type='checkbox' data-role='moderation' name="moderate[{$row->$idField}]" data-actions="{{if $row->mapped('featured')}}unfeature{{endif}} {{if $row->mapped('pinned')}}unpin{{endif}} delete" data-state='{{if $row->mapped('pinned')}}pinned{{endif}} {{if $row->mapped('featured')}}featured{{endif}}' class="ipsInput ipsInput--toggle">
|
|
</div>
|
|
{{endif}}
|
|
</li>
|
|
{{endif}}
|
|
{{else}}
|
|
<li data-ips-hook="topicRow" data-controller="cloud.front.realtime.forumsTopicRow" class="ipsData__item ipsData__item--snippet {{if $row->groupsPosted}}ipsData__item--highlighted{{endif}}{{if $row->isAssignedToMember()}} ipsData__item--assigned{{endif}} {{if method_exists( $row, 'tableClass' ) && $row->tableClass()}}ipsData__item--{$row->tableClass()}{{endif}} {{if $row->hidden() or $row->isFutureDate()}}ipsModerated{{endif}}{{if $row->isFutureDate()}} ipsModerated--alternate{{endif}}" data-rowID='{$row->$idField}' {{if isset($row->locationHash)}}data-location='{$row->locationHash}'{{endif}}' {{if $row->unread()}}data-ips-unread{{else}}data-ips-read{{endif}}>
|
|
<a href='{$row->url( "getPrefComment" )}' class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{$row->mapped('title')}</span></a>
|
|
<div class='ipsData__icon'>
|
|
{template="userPhoto" app="core" group="global" params="$row->author(), 'fluid'"}
|
|
</div>
|
|
<div class='ipsData__content'>
|
|
<div class='ipsData__main'>
|
|
<div class="ipsColumns">
|
|
<div class="ipsColumns__primary">
|
|
<div class='ipsData__title'>
|
|
{{if member.member_id}}
|
|
{{if $row->unread()}}
|
|
<a href="{$row->url( 'getNewComment' )}" class="ipsIndicator {{if \in_array( $row->$idField, $table->contentPostedIn )}}ipsIndicator--participated{{endif}}" aria-label='{lang="first_unread_post"}' data-ipsTooltip data-ips-hook="unreadIcon"></a>
|
|
{{else}}
|
|
<span class='ipsIndicator ipsIndicator--read {{if \in_array( $row->$idField, $table->contentPostedIn )}}ipsIndicator--participated{{endif}}' aria-hidden='true'></span>
|
|
{{endif}}
|
|
{{endif}}
|
|
<div data-ips-hook="badges" class="ipsBadges">
|
|
{template="assignmentBadge" app="core" group="global" params="$row, ''"}
|
|
{{if $row->prefix()}}
|
|
{template="prefix" group="global" app="core" params="$row->prefix( TRUE ), $row->prefix()"}
|
|
{{endif}}
|
|
{{foreach $row->badges() as $badge}}{$badge|raw}{{endforeach}}
|
|
</div>
|
|
<h4 data-ips-hook="title">
|
|
<a href='{$row->url( "getPrefComment" )}' title='{{if $row->mapped('title')}}{$row->mapped('title')}{{else}}{lang="content_deleted"}{{endif}} {{if $row->canEdit()}}{lang="click_hold_edit"}{{endif}}' {{if $row->tableHoverUrl and $row->canView()}} data-ipsHover data-ipsHover-target='{$row->url()->setQueryString('preview', 1)}' data-ipsHover-timeout='1.0'{{endif}}{{if $row->canEdit()}} data-role="editableTitle"{{endif}}>
|
|
<span>
|
|
{{if $row->mapped('title') or $row->mapped('title') == 0}}{$row->mapped('title')}{{else}}<em class="i-color_soft">{lang="content_deleted"}</em>{{endif}}
|
|
</span>
|
|
</a>
|
|
</h4>
|
|
{{if $row->commentPageCount() > 1}}
|
|
{$row->commentPagination( array(), 'miniPagination' )|raw}
|
|
{{endif}}
|
|
</div>
|
|
<div class='ipsData__meta i-font-weight_500'><!-- <a href="{$row->container()->url()}">{$row->container()->_title|raw}</a> · -->{lang="topic_started_username_date" htmlsprintf="$row->author()->link( NULL, NULL, $row->isAnonymous() ), \IPS\DateTime::ts( $row->mapped('date') )->html( false )"}</div>
|
|
</div>
|
|
<div class="ipsColumns__secondary">
|
|
{{if \count( $row->tags() )}}
|
|
{template="tags" group="global" app="core" params="$row->tags(), true"}
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
{{if isset($row->firstComment)}}
|
|
<p class='ipsData__desc'>{$row->firstComment->snippet(680)}</p>
|
|
{{endif}}
|
|
<div class='ipsData__extra'>
|
|
<ul data-ips-hook="stats" class='ipsData__stats'>
|
|
<li>
|
|
{template="reactionOverview" group="global" app="core" params="$row, NULL, NULL"}
|
|
</li>
|
|
{{foreach $row->stats(FALSE) as $k => $v}}
|
|
<li {{if $k == 'num_views'}} {{elseif \in_array( $k, $row->hotStats )}}class="ipsData__stats-hot" data-text='{lang="hot_item"}' data-ipsTooltip title='{lang="hot_item_desc"}'{{endif}} data-statType='{$k}' {{if $v === 0}}data-v="0"{{endif}}>
|
|
<span class='ipsData__stats-icon' data-stat-value="{number='$v' format='short'}" aria-hidden="true" data-ipstooltip title='{number="$v" format="short"} {lang="{$k}" pluralize="$v" format="short"}'></span>
|
|
<span class='ipsData__stats-label'>{number="$v" format="short"} {lang="{$k}" pluralize="$v" format="short"}</span>
|
|
{{if ( $k == 'forums_comments' OR $k == 'answers_no_number' ) && \IPS\forums\Topic::modPermission( 'unhide', NULL, $row->container() ) AND $unapprovedComments = $row->mapped('unapproved_comments')}}
|
|
<a href='{$row->url()->setQueryString( 'queued_posts', 1 )}' class='i-color_warning i-font-size_-2' data-ipsTooltip title='{lang="queued_posts_badge" pluralize="$row->topic_queuedposts"}'><i class='fa-solid fa-triangle-exclamation'></i> <strong>{$unapprovedComments}</strong></a>
|
|
{{endif}}
|
|
</li>
|
|
{{endforeach}}
|
|
{{if $row->followerCount}}
|
|
<li>
|
|
<a href='{url="app=core&module=system&controller=notifications&do=followers&follow_app=forums&follow_area=topic&follow_id={$row->tid}"}' rel="nofollow" title='{lang="followers_tooltip"}' data-ipsTooltip data-ipsDialog data-ipsDialog-size='narrow' data-ipsDialog-title='{lang="who_follows_this"}'>{lang="topic_follower_count" pluralize="$row->followerCount"}</a>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
<div data-ips-hook="latestPoster" class="ipsData__last">
|
|
{{if $row->mapped('num_comments') and $row->mapped( 'num_comments') > 1}}
|
|
{template="userPhoto" app="core" group="global" params="$row->lastCommenter(), 'fluid'"}
|
|
<div class="ipsData__last-text">
|
|
<div class='ipsData__last-primary'>
|
|
{lang="topic_snippet_last_reply" htmlsprintf="$row->lastCommenter()->link(), $row->url( 'getLastComment' ), \IPS\DateTime::ts( $row->mapped('last_comment') )->html( false )"}
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{{if $table->canModerate()}}
|
|
<div class='ipsData__mod'>
|
|
<input type='checkbox' data-role='moderation' name="moderate[{$row->$idField}]" data-actions="{expression="implode( ' ', $table->multimodActions( $row ) )"}" data-state='{{if $row->tableStates()}}{$row->tableStates()}{{endif}}' class="ipsInput ipsInput--toggle">
|
|
</div>
|
|
{{endif}}
|
|
</li>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
{{endif}}]]></template>
|
|
<template template_group="global" template_name="commentTableHeader" template_data="$comment, $topic" template_location="front" template_app="forums"><![CDATA[{{$idField = $topic::$databaseColumnId;}}
|
|
{{$iposted = $topic->container()->contentPostedIn( NULL, [ $topic->$idField ] );}}
|
|
<div>
|
|
<h3 class='ipsTitle ipsTitle--h3'>
|
|
{{if $topic->unread()}}
|
|
<a href='{$topic->url( 'getNewComment' )}' title='{lang="first_unread_post"}' data-ipsTooltip class='ipsIndicator {{if \in_array( $topic->$idField, $iposted )}}ipsIndicator--participated{{endif}}' data-ips-hook="unreadIcon"></a>
|
|
{{else}}
|
|
<span class='ipsIndicator ipsIndicator--read {{if \in_array( $topic->$idField, $iposted )}}ipsIndicator--participated{{endif}}'></span>
|
|
{{endif}}
|
|
<a href='{$comment->url()}' title='{lang="view_this_topic" sprintf="$topic->title"}'>{$topic->title}</a>
|
|
{{if $topic->container()->allow_rating}}
|
|
{template="rating" group="global" location="front" app="core" params="'large', $topic->rating_hits ? ( $topic->rating_total / $topic->rating_hits ) : 0"}
|
|
{{endif}}
|
|
</h3>
|
|
<p class='i-color_soft i-link-color_inherit'>{lang="in"} <a href='{$topic->container()->url()}'>{$topic->container()->_title}</a></p>
|
|
</div>]]></template>
|
|
<template template_group="global" template_name="embedPost" template_data="$comment, $item, $url" template_location="front" template_app="forums"><![CDATA[
|
|
<div class='ipsRichEmbed ipsRichEmbed--forum-post'>
|
|
{template="embedHeader" group="embed" app="core" params="$comment, $item->mapped('title'), $comment->mapped('date'), $url"}
|
|
<div class='ipsRichEmbed__content'>
|
|
<div class='ipsRichEmbed_originalItem'>
|
|
{template="embedOriginalItem" group="embed" app="core" params="$item, TRUE"}
|
|
</div>
|
|
<div class='ipsRichEmbed__snippet'>
|
|
{$comment->truncated(TRUE)|raw}
|
|
</div>
|
|
{{if settings.reputation_enabled and \IPS\IPS::classUsesTrait( $comment, 'IPS\Content\Reactable' ) and \count( $comment->reactions() )}}
|
|
<ul class='ipsList ipsList--inline'>
|
|
<li>
|
|
{template="reactionOverview" app="core" group="global" params="$comment, TRUE, 'small'"}
|
|
</li>
|
|
</ul>
|
|
{{endif}}
|
|
</div>
|
|
</div>]]></template>
|
|
<template template_group="global" template_name="embedTopic" template_data="$item, $url" template_location="front" template_app="forums"><![CDATA[<div class='ipsRichEmbed ipsRichEmbed--forum-topic'>
|
|
{template="embedHeader" group="embed" app="core" params="$item, $item->mapped('title'), $item->mapped('date'), $url"}
|
|
{{if $contentImage = $item->contentImages(1)}}
|
|
{{$attachType = key( $contentImage[0] );}}
|
|
{{$firstPhoto = \IPS\File::get( $attachType, $contentImage[0][ $attachType ] );}}
|
|
<a href='{$url}' class='ipsRichEmbed_masthead'>
|
|
<img src='{$firstPhoto->url}' alt='' loading="lazy">
|
|
</a>
|
|
{{endif}}
|
|
<div class='ipsRichEmbed__content'>
|
|
<div class='ipsRichEmbed__snippet'>
|
|
{$item->truncated(TRUE)|raw}
|
|
</div>
|
|
|
|
{template="embedItemStats" group="embed" app="core" params="$item"}
|
|
</div>
|
|
</div>]]></template>
|
|
<template template_group="global" template_name="manageFollowNodeRow" template_data="$table, $headers, $rows" template_location="front" template_app="forums"><![CDATA[{{foreach $rows as $row}}
|
|
{{$contentItemClass = $row::$contentItemClass;}}
|
|
<li class="ipsData__item ipsData__item--manage-follow-node-row {{if method_exists( $row, 'tableClass' ) && $row->tableClass()}}ipsData__item--{$row->tableClass()}{{endif}}" data-controller='core.front.system.manageFollowed' data-followID='{$row->_followData['follow_area']}-{$row->_followData['follow_rel_id']}'>
|
|
<div class='ipsData__content'>
|
|
<div class='ipsData__main'>
|
|
<h4 class='ipsData__title'>
|
|
{{if $row->_locked}}
|
|
<i class="fa-solid fa-lock"></i>
|
|
{{endif}}
|
|
<a href='{$row->url()}'>
|
|
{$row->_title}
|
|
</a>
|
|
</h4>
|
|
<ul class='ipsList ipsList--inline i-color_soft'>
|
|
{{if $row->memberCanAccessOthersTopics( \IPS\Member::loggedIn() ) }}
|
|
{{$count = \IPS\forums\Topic::contentCount( $row, TRUE );}}
|
|
<li>{lang="posts_number" pluralize="$count"}</li>
|
|
{{endif}}
|
|
</ul>
|
|
</div>
|
|
|
|
<div>
|
|
<span class='ipsBadge ipsBadge--icon ipsBadge--new {{if !$row->_followData['follow_is_anon']}}ipsHide{{endif}}' data-role='followAnonymous' data-ipsTooltip title='{lang="follow_is_anon"}'><i class='fa-solid fa-eye-slash'></i></span>
|
|
</div>
|
|
|
|
<div class='i-basis_180'>
|
|
<ul>
|
|
<li title='{lang="follow_when"}' data-role='followDate'><i class='fa-regular fa-clock'></i> {datetime="$row->_followData['follow_added']"}</li>
|
|
<li title='{lang="follow_how"}' data-role='followFrequency'>
|
|
{{if $row->_followData['follow_notify_freq'] == 'none'}}
|
|
<i class='fa-regular fa-bell-slash'></i>
|
|
{{else}}
|
|
<i class='fa-solid fa-bell'></i>
|
|
{{endif}} {lang="follow_freq_{$row->_followData['follow_notify_freq']}"}
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class='i-basis_180 i-text-align_center'>
|
|
{template="manageFollow" group="system" app="core" params="$row->_followData['follow_app'], $row->_followData['follow_area'], $row->_followData['follow_rel_id']"}
|
|
</div>
|
|
</div>
|
|
|
|
{{if $table->canModerate()}}
|
|
<div class='ipsData__mod'>
|
|
<input type='checkbox' data-role='moderation' name="moderate[{$row->_id}]" data-actions="{expression="implode( ' ', $table->multimodActions( $row ) )"}" data-state='' class="ipsInput ipsInput--toggle">
|
|
</div>
|
|
{{endif}}
|
|
</li>
|
|
{{endforeach}}]]></template>
|
|
<template template_group="global" template_name="row" template_data="$table, $headers, $topic, $showReadMarkers=TRUE" template_location="front" template_app="forums"><![CDATA[{{$idField = $topic::$databaseColumnId;}}
|
|
{{$iPosted = isset( $table->contentPostedIn ) ? $table->contentPostedIn : ( ( $table AND method_exists( $table, 'container' ) AND $topic->container() !== NULL ) ? $topic->container()->contentPostedIn() : array() );}}
|
|
<li data-ips-hook="row" class="ipsData__item {{if method_exists( $topic, 'tableClass' ) && $topic->tableClass()}}ipsData__item--{$topic->tableClass()}{{endif}} {{if $topic->hidden()}}ipsModerated{{endif}}" {{if $showReadMarkers and $topic->unread()}}data-ips-unread{{else}}data-ips-read{{endif}}>
|
|
<a href='{$topic->url( "getPrefComment" )}' class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{$topic->mapped('title')}</span></a>
|
|
{{if $showReadMarkers}}
|
|
{{if member.member_id}}
|
|
{{if $topic->unread()}}
|
|
<a href="{$topic->url( 'getNewComment' )}" class="ipsIndicator {{if \in_array( $topic->$idField, $iPosted )}}ipsIndicator--participated{{endif}}" aria-label='{lang="first_unread_post"}' data-ipsTooltip data-ips-hook="readMarker"></a>
|
|
{{else}}
|
|
<span class='ipsIndicator ipsIndicator--read {{if \in_array( $topic->$idField, $iPosted )}}ipsIndicator--participated{{endif}}' aria-hidden='true' data-ips-hook="readMarker"></span>
|
|
{{endif}}
|
|
{{endif}}
|
|
{{endif}}
|
|
<div class='ipsData__content'>
|
|
<div class='ipsData__main'>
|
|
<div class='ipsData__title'>
|
|
<div data-ips-hook="badges" class="ipsBadges">
|
|
{{foreach $topic->badges() as $badge}}{$badge|raw}{{endforeach}}
|
|
{{if $topic->prefix()}}
|
|
{template="prefix" group="global" app="core" params="$topic->prefix( TRUE ), $topic->prefix()"}</span>
|
|
{{endif}}
|
|
</div>
|
|
<h4 data-ips-hook="title">
|
|
<a href='{$topic->url( "getPrefComment" )}' {{if $topic->tableHoverUrl AND $topic->canView()}}data-ipsHover data-ipsHover-target='{$topic->url()->setQueryString('preview', 1)}' data-ipsHover-timeout='1.5' {{endif}}>
|
|
{$topic->mapped('title')}
|
|
</a>
|
|
</h4>
|
|
{{if $topic->commentPageCount() > 1}}
|
|
{$topic->commentPagination( array(), 'miniPagination' )|raw}
|
|
{{endif}}
|
|
</div>
|
|
<div class='ipsData__meta'>
|
|
{lang="byline" htmlsprintf="$topic->author()->link( NULL, NULL, $topic->isAnonymous() )"} {datetime="$topic->mapped('date')"}
|
|
{{if \IPS\Request::i()->controller != 'forums'}}
|
|
{lang="in"} <a href="{$topic->container()->url()}">{$topic->container()->_title}</a>
|
|
{{endif}}
|
|
</div>
|
|
{{if \count( $topic->tags() )}}
|
|
{template="tags" group="global" app="core" params="$topic->tags(), true, true"}
|
|
{{endif}}
|
|
</div>
|
|
<ul data-ips-hook="stats" class='ipsData__stats'>
|
|
{{foreach $topic->stats(FALSE) as $k => $v}}
|
|
<li {{if \in_array( $k, $topic->hotStats )}}class="ipsData__stats-hot" data-text='{lang="hot_item"}' data-ipsTooltip title='{lang="hot_item_desc"}'{{endif}}>
|
|
<span class='ipsData__stats-icon' data-stat-value="{number='$v' format='short'}" aria-hidden="true" data-ipstooltip title='{number="$v" format="short"} {lang="{$k}" pluralize="$v" format="short"}'></span>
|
|
<span class='ipsData__stats-label'>{number="$v"} {lang="{$k}" pluralize="$v"}</span>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
<div class="ipsData__last">
|
|
<div class="ipsPhotoPanel" data-ips-hook="latestUserPhoto">
|
|
{{if $topic->mapped('num_comments')}}
|
|
{template="userPhoto" app="core" group="global" params="$topic->lastCommenter(), 'fluid'"}
|
|
{{else}}
|
|
{template="userPhoto" app="core" group="global" params="$topic->author(), 'fluid'"}
|
|
{{endif}}
|
|
<div class="ipsPhotoPanel__text">
|
|
<div class="ipsPhotoPanel__primary">
|
|
{{if $topic->mapped('num_comments')}}
|
|
{$topic->lastCommenter()->link()|raw}
|
|
{{else}}
|
|
{$topic->author()->link( NULL, NULL, $topic->isAnonymous() )|raw}
|
|
{{endif}}
|
|
</div>
|
|
<div class="ipsPhotoPanel__secondary">
|
|
<a href='{$topic->url( 'getLastComment' )}' title='{lang="get_last_post"}'>
|
|
{{if $topic->mapped('last_comment')}}<span class='ipsData__last-replied'>{lang="replied_lc"}</span> {datetime="$topic->mapped('last_comment')"}{{else}}{datetime="$topic->mapped('date')"}{{endif}}
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{{if $table AND method_exists( $table, 'canModerate' ) AND $table->canModerate()}}
|
|
<div class='ipsData__mod'>
|
|
<input class="ipsInput ipsInput--toggle" type='checkbox' data-role='moderation' name="moderate[{$topic->tid}]" data-actions="{expression="implode( ' ', $table->multimodActions( $topic ) )"}" data-state='{{if $topic->tableStates()}}{$topic->tableStates()}{{endif}}'>
|
|
</div>
|
|
{{endif}}
|
|
</li>]]></template>
|
|
<template template_group="global" template_name="rows" template_data="$table, $headers, $rows" template_location="front" template_app="forums">{{if \count( $rows )}}
|
|
{{foreach $rows as $row}}
|
|
{template="row" group="global" app="forums" params="$table, $headers, $row"}
|
|
{{endforeach}}
|
|
{{endif}}</template>
|
|
<template template_group="global" template_name="searchNoPermission" template_data="$lang, $link=NULL" template_location="front" template_app="forums"><![CDATA[<li class="ipsStreamItem ipsStreamItem--password ipsStreamItem_contentBlock">
|
|
<div class='ipsStreamItem__iconCell'>
|
|
<i class="fa-solid fa-lock"></i>
|
|
</div>
|
|
<div class='ipsStreamItem__mainCell'>
|
|
<div class='i-color_soft i-font-weight_500'>
|
|
{$lang}{{if $link}} <a href="{$link}">{lang="enter_password"}</a>{{endif}}
|
|
</div>
|
|
</div>
|
|
</li>
|
|
]]></template>
|
|
<template template_group="index" template_name="forumGridItem" template_data="$forum, $isSubForum=FALSE" template_location="front" template_app="forums"><![CDATA[{{if $forum->can('view')}}
|
|
{{$lastPosts = $forum->lastPost(2);}}
|
|
{{$club = $forum->club();}}
|
|
<li data-ips-hook="gridItem" class="{$forum->ui( 'css' )} ipsData__item {{if $forum->redirect_on}}ipsData__item--redirect{{elseif $forum->password}}ipsData__item--password{{else}}ipsData__item--forum{{endif}}" data-forumID="{$forum->_id}" {{if \IPS\forums\Topic::containerUnread( $forum ) && !$forum->redirect_on}}data-ips-unread{{else}}data-ips-read{{endif}} {template="formattedInlineStyle" params="$forum" app="core" group="global" location="front"} {$forum->ui( 'dataAttributes' )}>
|
|
{{if $forum->password && !$forum->loggedInMemberHasPasswordAccess()}}
|
|
<a href="{$forum->url()->setQueryString( 'passForm', '1' )}" data-ipsDialog data-ipsDialog-size='narrow' data-ipsDialog-title='{lang="forum_requires_password" sprintf="$forum->_title"}' class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{$forum->_title}</span></a>
|
|
{{else}}
|
|
<a href="{$forum->url()}" class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{{if $club}}{lang="club_node" sprintf="$club->name, $forum->_title"}{{else}}{$forum->_title}{{endif}}</span></a>
|
|
{{endif}}
|
|
<a {{if $forum->password && !$forum->loggedInMemberHasPasswordAccess()}}href="{$forum->url()->setQueryString( 'passForm', '1' )}" data-ipsDialog data-ipsDialog-size='narrow' data-ipsDialog-title='{lang="forum_requires_password" sprintf="$forum->_title"}'{{else}}href="{$forum->url()}"{{endif}} class='ipsData__image' title='{{if $club}}{lang="club_node" sprintf="$club->name, $forum->_title"}{{else}}{$forum->_title}{{endif}}'>
|
|
{{if $forum->card_image}}
|
|
<img src='{file="$forum->card_image" extension="forums_Cards"}' alt='' loading='lazy'>
|
|
{{elseif $club}}
|
|
{{$coverPhoto = $club->coverPhoto( FALSE );}}
|
|
{{$cfObject = $coverPhoto->object;}}
|
|
{{if $coverPhoto->file}}
|
|
<img src="{$coverPhoto->file->url}" alt='' loading='lazy'>
|
|
{{elseif $club->profile_photo}}
|
|
<img src='{file="$club->profile_photo" extension="core_Clubs"}' alt='' loading='lazy'>
|
|
{{elseif ! empty( $cfObject::$coverPhotoDefault )}}
|
|
<div class="ipsFallbackImage" style="--i-empty-image-random--ba-co: {$coverPhoto->object->coverPhotoBackgroundColor()};"></div>
|
|
{{endif}}
|
|
{{else}}
|
|
<i></i>
|
|
{{endif}}
|
|
</a>
|
|
<div class='ipsData__content'>
|
|
<div class='ipsData__main'>
|
|
<div class='ipsData__title'>
|
|
{{if !$forum->redirect_on AND \IPS\forums\Topic::containerUnread( $forum ) AND \IPS\Member::loggedIn()->member_id}}
|
|
<span class="ipsBadge ipsBadge--new">New</span>
|
|
{{endif}}
|
|
<h3 data-ips-hook="title">
|
|
{{if $forum->password && !$forum->loggedInMemberHasPasswordAccess()}}
|
|
<a href="{$forum->url()->setQueryString( 'passForm', '1' )}" data-ipsDialog data-ipsDialog-size='narrow' data-ipsDialog-title='{lang="forum_requires_password" sprintf="$forum->_title"}'>{$forum->_title}</a>
|
|
{{else}}
|
|
<a href="{$forum->url()}">{{if $club}}{lang="club_node" sprintf="$club->name, $forum->_title"}{{else}}{$forum->_title}{{endif}}</a>
|
|
{{endif}}
|
|
{{if $forum->password}}
|
|
{{if !$forum->loggedInMemberHasPasswordAccess()}}
|
|
<i class="fa-solid fa-lock i-font-size_-2 i-color_soft"></i>
|
|
{{endif}}
|
|
{{endif}}
|
|
{{if $forum->redirect_on}}
|
|
<i class="fa-solid fa-arrow-right i-font-size_-2 i-color_soft"></i>
|
|
{{endif}}
|
|
</h3>
|
|
</div>
|
|
{{if $forum->description}}
|
|
<div class="ipsData__desc">
|
|
{template="richText" group="global" app="core" location="global" params="$forum->description, array('')"}
|
|
</div>
|
|
{{endif}}
|
|
{{if $forum->hasChildren()}}
|
|
<ul data-ips-hook="children" class="ipsSubList">
|
|
{{foreach $forum->children() as $subforum}}
|
|
<li class="ipsSubList__item {{if \IPS\forums\Topic::containerUnread( $subforum )}}ipsSubList__item--unread{{else}}ipsSubList__item--read{{endif}}">
|
|
<a href="{$subforum->url()}">{$subforum->_title}</a>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
{{endif}}
|
|
</div>
|
|
<ul data-ips-hook="stats" class='ipsData__stats'>
|
|
{{if !$forum->redirect_on}}
|
|
{{$count = \IPS\forums\Topic::contentCount( $forum, TRUE );}}
|
|
<li>{lang="posts_number" pluralize="$count" format="long"}</li>
|
|
{{if $forum->followerCount}}
|
|
<li data-el='grid-follower-count'>
|
|
<a href='{url="app=core&module=system&controller=notifications&do=followers&follow_app=forums&follow_area=forum&follow_id={$forum->_id}"}' title='{lang="followers_tooltip"}' data-ipsTooltip data-ipsDialog data-ipsDialog-size='narrow' data-ipsDialog-title='{lang="who_follows_this"}'>{lang="forum_follower_count" pluralize="$forum->followerCount"}</a>
|
|
</li>
|
|
{{endif}}
|
|
{{else}}
|
|
<li>{lang="redirect_hits" pluralize="$forum->redirect_hits"}</li>
|
|
{{endif}}
|
|
{{if \IPS\forums\Topic::modPermission( 'unhide', NULL, $forum ) AND $forum->queued_topics}}
|
|
<li class='i-color_negative i-link-color_inherit'>
|
|
<i class='fa-solid fa-triangle-exclamation'></i>
|
|
<a href='{$forum->url()->setQueryString( array( 'filter' => 'queued_topics' ) )}'>{lang="queued_topics_badge" pluralize="$forum->queued_topics"}</a>
|
|
</li>
|
|
{{endif}}
|
|
{{if \IPS\forums\Topic::modPermission( 'unhide', NULL, $forum ) AND $forum->queued_posts}}
|
|
<li class='i-color_negative i-link-color_inherit'>
|
|
<i class='fa-solid fa-triangle-exclamation'></i>
|
|
<a href='{$forum->url()->setQueryString( array( 'filter' => 'queued_posts' ) )}'>{lang="queued_posts_badge" pluralize="$forum->queued_posts"}</a>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
{{if $lastPosts and count( $lastPosts )}}
|
|
{{foreach $lastPosts as $lastPost}}
|
|
<div class="ipsData__last" data-ips-hook="latestPoster">
|
|
{template="userPhoto" app="core" group="global" params="$lastPost['author'], 'fluid'"}
|
|
<div class="ipsData__last-text">
|
|
<div class="ipsData__last-primary"><a href="{{if member.member_id}}{$lastPost['topic_url']->setQueryString( 'do', 'getNewComment' )}{{else}}{$lastPost['topic_url']}{{endif}}" title='{$lastPost['topic_title']}'>{$lastPost['topic_title']}</a></div>
|
|
<small class="ipsData__last-secondary">
|
|
{{if $lastPost['last_poster_anon']}}
|
|
{lang="byline_nodate" htmlsprintf="$lastPost['author']->link( NULL, NULL, TRUE )"},
|
|
{{else}}
|
|
{lang="byline_nodate" htmlsprintf="$lastPost['author']->link()"},
|
|
{{endif}}
|
|
{{if $lastPost['topic_title']}}
|
|
<a href='{{if member.member_id}}{$lastPost['topic_url']->setQueryString( 'do', 'getLastComment' )}{{else}}{$lastPost['topic_url']}{{endif}}' title='{lang="get_last_post"}'>{datetime="$lastPost['date']"}</a>
|
|
{{else}}
|
|
{datetime="$lastPost['date']"}
|
|
{{endif}}
|
|
</small>
|
|
</div>
|
|
</div>
|
|
{{endforeach}}
|
|
{{endif}}
|
|
</div>
|
|
</li>
|
|
{{endif}}]]></template>
|
|
<template template_group="index" template_name="forumRow" template_data="$forum, $isSubForum=FALSE, $table=NULL" template_location="front" template_app="forums"><![CDATA[{{if $forum->can('view')}}
|
|
{{$lastPost = $forum->lastPost();}}
|
|
{{$club = $forum->club();}}
|
|
<li data-ips-hook="rowItem" class="{$forum->ui( 'css' )} ipsData__item {{if !$forum->redirect_on && !$forum->password}}ipsData__item--discussions{{endif}} {{if $forum->redirect_on}}ipsData__item--redirect{{endif}} {{if $forum->password}}ipsData__item--password {{if $forum->loggedInMemberHasPasswordAccess()}}ipsData__item--password-known{{endif}}{{endif}}" data-forumID="{$forum->_id}" {template="formattedInlineStyle" params="$forum" app="core" group="global" location="front"} {{if \IPS\forums\Topic::containerUnread( $forum ) && !$forum->redirect_on}}data-ips-unread{{else}}data-ips-read{{endif}} {$forum->ui( 'dataAttributes' )}>
|
|
{{if $forum->password && !$forum->loggedInMemberHasPasswordAccess()}}
|
|
<a href="{$forum->url()->setQueryString( 'passForm', '1' )}" data-ipsDialog data-ipsDialog-size='narrow' data-ipsDialog-title='{lang="forum_requires_password" sprintf="$forum->_title"}' class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{$forum->_title}</span></a>
|
|
{{else}}
|
|
<a href="{$forum->url()}" class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{{if $club}}{lang="club_node" sprintf="$club->name, $forum->_title"}{{else}}{$forum->_title}{{endif}}</span></a>
|
|
{{endif}}
|
|
<div class="ipsData__image">
|
|
{{if $club}}
|
|
<img src="{{if $club->profile_photo}}{file="$club->profile_photo" extension="core_Clubs"}{{else}}{resource="default_club.png" app="core" location="global"}{{endif}}" alt='' loading='lazy'>
|
|
{{elseif $forum->icon}}
|
|
{$forum->getIcon()|raw}
|
|
{{else}}
|
|
<span class='ipsIcon ipsIcon--fa' aria-hidden="true"><i class="fa-ips"></i></span>
|
|
{{endif}}
|
|
</div>
|
|
<div class="ipsData__content">
|
|
<div class="ipsData__main">
|
|
<div class='ipsData__title'>
|
|
{{if \IPS\forums\Topic::containerUnread( $forum ) && !$forum->redirect_on}}
|
|
<span class="ipsIndicator" title='{lang="unread"}' data-ipstooltip></span>
|
|
{{endif}}
|
|
<h3 data-ips-hook="title">
|
|
{{if $forum->password && !$forum->loggedInMemberHasPasswordAccess()}}
|
|
<a href="{$forum->url()->setQueryString( 'passForm', '1' )}" data-ipsDialog data-ipsDialog-size='narrow' data-ipsDialog-title='{lang="forum_requires_password" sprintf="$forum->_title"}'>{$forum->_title}</a>
|
|
{{else}}
|
|
<a href="{$forum->url()}">{{if $club}}{lang="club_node" sprintf="$club->name, $forum->_title"}{{else}}{$forum->_title}{{endif}}</a>
|
|
{{endif}}
|
|
</h3>
|
|
</div>
|
|
{{if \IPS\forums\Topic::modPermission( 'unhide', NULL, $forum ) AND $unapprovedContent = $forum->unapprovedContentRecursive() and ( $unapprovedContent['topics'] OR $unapprovedContent['posts'] )}}
|
|
<div data-ips-hook="pendingIcons" class='i-color_warning i-font-size_-1'>
|
|
<strong>
|
|
{lang="pending_approval"}:
|
|
{{if $unapprovedContent['topics']}}
|
|
<a href='{$forum->url()->setQueryString( array( 'filter' => 'queued_topics' ) )}' class='i-color_inherit'>{lang="queued_topics_badge" pluralize="$unapprovedContent['topics']"}</a>
|
|
{{endif}}
|
|
{{if $unapprovedContent['topics'] && $unapprovedContent['posts']}} & {{endif}}
|
|
{{if $unapprovedContent['posts']}}
|
|
<a href='{$forum->url()->setQueryString( array( 'filter' => 'queued_posts' ) )}' class='i-color_inherit'>{lang="queued_posts_badge" pluralize="$unapprovedContent['posts']"}</a>
|
|
{{endif}}
|
|
</strong>
|
|
</div>
|
|
{{endif}}
|
|
{{if $forum->description}}
|
|
{template="richText" group="global" app="core" location="global" params="$forum->description, array('ipsData__desc')"}
|
|
{{endif}}
|
|
{{if $forum->hasChildren()}}
|
|
<ul data-ips-hook="children" class="ipsSubList">
|
|
{{foreach $forum->children() as $subforum}}
|
|
<li class="ipsSubList__item {{if \IPS\forums\Topic::containerUnread( $subforum )}}ipsSubList__item--unread{{else}}ipsSubList__item--read{{endif}}">
|
|
<a href="{$subforum->url()}">{$subforum->_title}</a>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
{{endif}}
|
|
</div>
|
|
{{if $forum->redirect_on}}
|
|
<div class="ipsData__last">
|
|
<div class='ipsData__last-text'>
|
|
<span class='ipsData__last-secondary'>{lang="redirect_hits" pluralize="$forum->redirect_hits"}</span>
|
|
</div>
|
|
</div>
|
|
{{else}}
|
|
{{if $lastPost AND ( $forum->can_view_others OR \IPS\Member::loggedIn()->modPermission('can_read_all_topics') OR ( \is_array( \IPS\Member::loggedIn()->modPermission('forums') ) AND \in_array( $forum->_id, \IPS\Member::loggedIn()->modPermission('forums') ) ))}}
|
|
<ul data-ips-hook="stats" class="ipsData__stats ipsData__stats--large">
|
|
{{$count = \IPS\forums\Topic::contentCount( $forum, TRUE );}}
|
|
<li>
|
|
<span>{number="$count" format="short"}</span>
|
|
<span>{lang="posts_no_number" pluralize="$count" format="short"}</span>
|
|
</li>
|
|
</ul>
|
|
{{endif}}
|
|
{{if $lastPost}}
|
|
<div data-ips-hook="latestPoster" class="ipsData__last">
|
|
{template="userPhoto" app="core" group="global" params="$lastPost['author'], 'fluid'"}
|
|
<div class='ipsData__last-text'>
|
|
{{if $lastPost['topic_title']}}
|
|
<div class='ipsData__last-primary'>
|
|
<a href="{{if member.member_id}}{$lastPost['topic_url']->setQueryString( 'do', 'getNewComment' )}{{else}}{$lastPost['topic_url']}{{endif}}" title='{$lastPost['topic_title']}'>{$lastPost['topic_title']}</a>
|
|
</div>
|
|
{{endif}}
|
|
<div class='ipsData__last-secondary'>
|
|
{{if $lastPost['last_poster_anon']}}
|
|
{lang="byline_nodate" htmlsprintf="$lastPost['author']->link( NULL, NULL, TRUE )"},
|
|
{{else}}
|
|
{lang="byline_nodate" htmlsprintf="$lastPost['author']->link()"},
|
|
{{endif}}
|
|
{{if $lastPost['topic_title']}}
|
|
<a href='{{if member.member_id}}{$lastPost['topic_url']->setQueryString( 'do', 'getLastComment' )}{{else}}{$lastPost['topic_url']}{{endif}}' title='{lang="get_last_post"}'>{datetime="$lastPost['date']"}</a>
|
|
{{else}}
|
|
{datetime="$lastPost['date']"}
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
{{endif}}
|
|
</div>
|
|
</li>
|
|
{{endif}}]]></template>
|
|
<template template_group="index" template_name="forumSummaryRow" template_data="$forum, $isSubForum=FALSE" template_location="front" template_app="forums"><![CDATA[{{if $forum->can('view')}}
|
|
{{$lastPosts = $forum->lastPost(5);}}
|
|
{{$club = $forum->club();}}
|
|
<section class="{$forum->ui( 'css' )} ipsCategoryWithFeed__item" data-forumID="{$forum->_id}" data-type='{{if $forum->redirect_on}}redirect{{elseif $forum->password}}password{{else}}forum{{endif}}' {$forum->ui( 'dataAttributes' )} {{if $forum->feature_color}}style='--i-featured:{$forum->feature_color}'{{endif}}>
|
|
<i-data class='ipsCategoryWithFeed__meta'>
|
|
<div class="ipsData ipsData--grid ipsData--forumFeedViewParent">
|
|
<div class="ipsData__item" {{if \IPS\forums\Topic::containerUnread( $forum ) && !$forum->redirect_on}}data-ips-unread{{else}}data-ips-read{{endif}}>
|
|
<a {{if $forum->password && !$forum->loggedInMemberHasPasswordAccess()}}href="{$forum->url()->setQueryString( 'passForm', '1' )}" data-ipsDialog data-ipsDialog-size='narrow' data-ipsDialog-title='{lang="forum_requires_password" sprintf="$forum->_title"}'{{else}}href="{$forum->url()}"{{endif}} class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{{if $forum->password && !$forum->loggedInMemberHasPasswordAccess()}}{$forum->_title}{{elseif $club}}{lang="club_node" sprintf="$club->name, $forum->_title"}{{else}}{$forum->_title}{{endif}}</span></a>
|
|
<a {{if $forum->password && !$forum->loggedInMemberHasPasswordAccess()}}href="{$forum->url()->setQueryString( 'passForm', '1' )}" data-ipsDialog data-ipsDialog-size='narrow' data-ipsDialog-title='{lang="forum_requires_password" sprintf="$forum->_title"}'{{else}}href="{$forum->url()}"{{endif}} class='ipsData__image'>
|
|
{{if $club and ! $forum->card_image}}
|
|
{{$coverPhoto = $club->coverPhoto( FALSE );}}
|
|
{{$cfObject = $coverPhoto->object;}}
|
|
{{if $coverPhoto->file}}
|
|
<img src="{$coverPhoto->file->url}" alt='' loading='lazy'>
|
|
{{elseif $club->profile_photo}}
|
|
<img src='{file="$club->profile_photo" extension="core_Clubs"}' alt='' loading='lazy'>
|
|
{{elseif ! empty( $cfObject::$coverPhotoDefault )}}
|
|
<div class="ipsFallbackImage" style="--i-empty-image-random--ba-co: {$coverPhoto->object->coverPhotoBackgroundColor()};"></div>
|
|
{{endif}}
|
|
{{elseif $forum->card_image}}
|
|
<img src='{file="$forum->card_image" extension="forums_Cards"}' alt='' loading='lazy'>
|
|
{{elseif $forum->icon}}
|
|
{$forum->getIcon()|raw}
|
|
{{else}}
|
|
<i></i>
|
|
{{endif}}
|
|
<span class="ipsInvisible">
|
|
{{if $forum->password && !$forum->loggedInMemberHasPasswordAccess()}}
|
|
{$forum->_title}
|
|
{{elseif $club}}
|
|
{lang="club_node" sprintf="$club->name, $forum->_title"}
|
|
{{else}}
|
|
{$forum->_title}
|
|
{{endif}}
|
|
</span>
|
|
</a>
|
|
<div class="ipsData__content">
|
|
<div class="ipsData__main">
|
|
<header class='ipsData__title'>
|
|
{{if !$forum->redirect_on AND \IPS\forums\Topic::containerUnread( $forum ) AND \IPS\Member::loggedIn()->member_id}}
|
|
<span class="ipsBadge ipsBadge--new">{lang="new"}</span>
|
|
{{endif}}
|
|
<h3>
|
|
{{if $forum->password && !$forum->loggedInMemberHasPasswordAccess()}}
|
|
<a href="{$forum->url()->setQueryString( 'passForm', '1' )}" data-ipsDialog data-ipsDialog-size='narrow' data-ipsDialog-title='{lang="forum_requires_password" sprintf="$forum->_title"}'>{$forum->_title}</a>
|
|
{{else}}
|
|
<a href="{$forum->url()}">{{if $club}}{lang="club_node" sprintf="$club->name, $forum->_title"}{{else}}{$forum->_title}{{endif}}</a>
|
|
{{endif}}
|
|
</h3>
|
|
{{if $forum->password && !$forum->loggedInMemberHasPasswordAccess()}}
|
|
<i class="fa-solid fa-lock i-font-size_-2 i-color_soft"></i>
|
|
{{endif}}
|
|
{{if $forum->redirect_on}}
|
|
<i class="fa-solid fa-arrow-right i-font-size_-2 i-color_soft"></i>
|
|
{{endif}}
|
|
</header>
|
|
{{if $forum->description}}
|
|
{template="richText" group="global" app="core" location="global" params="$forum->description, array('ipsData__desc ipsData__desc--all')"}
|
|
{{endif}}
|
|
{{if $forum->hasChildren()}}
|
|
<ul class="ipsSubList">
|
|
{{foreach $forum->children() as $subforum}}
|
|
<li class="ipsSubList__item {{if \IPS\forums\Topic::containerUnread( $subforum )}}ipsSubList__item--unread{{else}}ipsSubList__item--read{{endif}}">
|
|
<a href="{$subforum->url()}">{$subforum->_title}</a>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
{{endif}}
|
|
</div>
|
|
<div class="ipsData__extra">
|
|
<ul class='ipsData__stats'>
|
|
{{if !$forum->redirect_on}}
|
|
{{$count = \IPS\forums\Topic::contentCount( $forum, TRUE );}}
|
|
{{if $count > 0}}<li>{lang="posts_number" pluralize="$count" format="long"}</li>{{endif}}
|
|
{{if $forum->followerCount}}
|
|
<li data-el='grid-follower-count'>
|
|
<a href='{url="app=core&module=system&controller=notifications&do=followers&follow_app=forums&follow_area=forum&follow_id={$forum->_id}"}' title='{lang="followers_tooltip"}' data-ipsTooltip data-ipsDialog data-ipsDialog-size='narrow' data-ipsDialog-title='{lang="who_follows_this"}'>{lang="forum_follower_count" pluralize="$forum->followerCount"}</a>
|
|
</li>
|
|
{{endif}}
|
|
{{else}}
|
|
<li>{lang="redirect_hits" pluralize="$forum->redirect_hits"}</li>
|
|
{{endif}}
|
|
{{if \IPS\forums\Topic::modPermission( 'unhide', NULL, $forum ) AND $forum->queued_topics}}
|
|
<li class='i-color_negative i-link-color_inherit'>
|
|
<i class='fa-solid fa-triangle-exclamation'></i>
|
|
<a href='{$forum->url()->setQueryString( array( 'filter' => 'queued_topics' ) )}'>{lang="queued_topics_badge" pluralize="$forum->queued_topics"}</a>
|
|
</li>
|
|
{{endif}}
|
|
{{if \IPS\forums\Topic::modPermission( 'unhide', NULL, $forum ) AND $forum->queued_posts}}
|
|
<li class='i-color_negative i-link-color_inherit'>
|
|
<i class='fa-solid fa-triangle-exclamation'></i>
|
|
<a href='{$forum->url()->setQueryString( array( 'filter' => 'queued_posts' ) )}'>{lang="queued_posts_badge" pluralize="$forum->queued_posts"}</a>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</i-data>
|
|
{{if !$forum->redirect_on}}
|
|
{{if $lastPosts and count( $lastPosts )}}
|
|
<i-data>
|
|
<ul data-ips-hook="latestPoster" class='ipsData ipsData--table ipsData--forumFeedView'>
|
|
{{foreach $lastPosts as $lastPost}}
|
|
<li class='ipsData__item'>
|
|
<a href="{{if member.member_id}}{$lastPost['topic_url']->setQueryString( 'do', 'getNewComment' )}{{else}}{$lastPost['topic_url']}{{endif}}" class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{$lastPost['topic_title']}</span></a>
|
|
<div class="ipsData__icon">{template="userPhoto" app="core" group="global" params="$lastPost['author'], 'fluid'"}</div>
|
|
<div class="ipsData__content">
|
|
<div class="ipsData__main">
|
|
<h4 class="ipsData__title">
|
|
<a href="{{if member.member_id}}{$lastPost['topic_url']->setQueryString( 'do', 'getNewComment' )}{{else}}{$lastPost['topic_url']}{{endif}}" title='{$lastPost['topic_title']}'>{$lastPost['topic_title']}</a>
|
|
</h4>
|
|
<small class="ipsData__meta">
|
|
|
|
</small>
|
|
</div>
|
|
<div class="ipsData__extra">
|
|
<ul class="ipsData__stats">
|
|
<li data-statType='comments' data-v="{$lastPost['posts']}">
|
|
<span class='ipsData__stats-label'>{lang="num_comments" pluralize="$lastPost['posts']"}</span>
|
|
</li>
|
|
</ul>
|
|
<div class="ipsData__last">
|
|
<div class="ipsData__last-text">
|
|
<div class="ipsData__last-primary">
|
|
{{if $lastPost['last_poster_anon']}}
|
|
{lang="byline_nodate" htmlsprintf="$lastPost['author']->link( NULL, NULL, TRUE )"}
|
|
{{else}}
|
|
{lang="byline_nodate" htmlsprintf="$lastPost['author']->link()"}
|
|
{{endif}}
|
|
</div>
|
|
<div class="ipsData__last-secondary">
|
|
{{if $lastPost['topic_title']}}
|
|
<a href='{{if member.member_id}}{$lastPost['topic_url']->setQueryString( 'do', 'getLastComment' )}{{else}}{$lastPost['topic_url']}{{endif}}' title='{lang="get_last_post"}'>{datetime="$lastPost['date']"}</a>
|
|
{{else}}
|
|
{datetime="$lastPost['date']"}
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</i-data>
|
|
{{else}}
|
|
<div>
|
|
<p class='ipsEmptyMessage'>
|
|
{{if $forum->password && !$forum->loggedInMemberHasPasswordAccess()}}
|
|
<a href="{$forum->url()->setQueryString( 'passForm', '1' )}" data-ipsDialog data-ipsDialog-size='narrow' data-ipsDialog-title='{lang="forum_requires_password" sprintf="$forum->_title"}'>{lang="no_forum_posts_password"}</a>
|
|
{{else}}
|
|
{lang="no_forum_posts"}
|
|
{{endif}}
|
|
</p>
|
|
</div>
|
|
{{endif}}
|
|
{{endif}}
|
|
</section>
|
|
{{endif}}]]></template>
|
|
<template template_group="index" template_name="forumTableRow" template_data="$table, $headers, $forums" template_location="front" template_app="forums">{{foreach $forums as $forum}}
|
|
{template="forumRow" group="index" app="forums" params="$forum, FALSE, $table"}
|
|
{{endforeach}}</template>
|
|
<template template_group="index" template_name="index" template_data="" template_location="front" template_app="forums"><![CDATA[
|
|
<header class='ipsPageHeader ipsPageHeader--forum-table'>
|
|
<div class="ipsPageHeader__row">
|
|
<div data-ips-hook="header" class='ipsPageHeader__primary'>
|
|
<h1 data-ips-hook="title" class='ipsPageHeader__title'>{lang="forums"}</h1>
|
|
</div>
|
|
<ul class='ipsButtons ipsButtons--main'>
|
|
{{if \IPS\forums\Forum::canOnAny( 'add' ) }}
|
|
<li>
|
|
<a href='{url="app=forums&module=forums&controller=forums&do=add" seoTemplate="topic_non_forum_add_button"}' class='ipsButton ipsButton--primary' data-ipsDialog data-ipsDialog-size='narrow' data-ipsDialog-title='{lang="select_forum"}'><i class="fa-regular fa-pen-to-square"></i><span>{lang="start_new_topic"}</span></a>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
</div>
|
|
</header>
|
|
<section>
|
|
<ol class='ipsBlockSpacer' data-controller='core.global.core.table, forums.front.forum.forumList' data-baseURL=''>
|
|
{{foreach \IPS\forums\Forum::roots() as $category}}
|
|
{{if $category->can('view') && $category->hasChildren()}}
|
|
<li data-categoryID='{$category->_id}' class='ipsBox ipsPull'>
|
|
<h2 class="ipsBox__header">
|
|
<a href='{$category->url()}'>{$category->_title}</a>
|
|
<button class='ipsBox__header-toggle' type="button" aria-expanded='true' aria-controls='forum-category_{$category->_id}' data-ipscontrols data-action='toggleCategory' data-ipsTooltip aria-label='{lang="toggle_this_category"}'><i></i></button>
|
|
</h2>
|
|
{{if \IPS\Member::loggedIn()->getLayoutValue('forums_forum') === 'grid'}}
|
|
<i-data>
|
|
<ol class='ipsData ipsData--grid ipsData--category ipsData--forum-grid ipsBox__content' id='forum-category_{$category->_id}' data-ips-hidden-animation="slide" data-ips-hidden-event="ips:toggleForumCategory">
|
|
{{foreach $category->children() as $forum}}
|
|
{template="forumGridItem" group="index" app="forums" params="$forum"}
|
|
{{endforeach}}
|
|
</ol>
|
|
</i-data>
|
|
{{elseif \IPS\Member::loggedIn()->getLayoutValue('forums_forum') === 'modern'}}
|
|
<div class='ipsCategoryWithFeed ipsBox__content' id='forum-category_{$category->_id}' data-ips-hidden-animation="slide" data-ips-hidden-event="ips:toggleForumCategory">
|
|
{{foreach $category->children() as $forum}}
|
|
{template="forumSummaryRow" group="index" app="forums" params="$forum"}
|
|
{{endforeach}}
|
|
</div>
|
|
{{else}}
|
|
<i-data>
|
|
<ol class="ipsData ipsData--table ipsData--category ipsData--forum-category ipsBox__content" id='forum-category_{$category->_id}' data-ips-hidden-animation="slide" data-ips-hidden-event="ips:toggleForumCategory">
|
|
{{foreach $category->children() as $forum}}
|
|
{template="forumRow" group="index" app="forums" params="$forum"}
|
|
{{endforeach}}
|
|
</ol>
|
|
</i-data>
|
|
{{endif}}
|
|
</li>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
{{if settings.club_nodes_in_apps and $clubForums = \IPS\forums\Forum::clubNodes()}}
|
|
<li data-ips-hook="clubs" data-categoryID='clubs' class='ipsBox ipsPull'>
|
|
<h2 class="ipsBox__header">
|
|
<a href='{url="app=forums&module=forums&controller=forums&do=clubs" seoTemplate="forums_clubs"}'>{lang="club_node_forums"}</a>
|
|
<button class='ipsBox__header-toggle' type="button" aria-expanded='true' aria-controls='forum-category_clubs' data-ipscontrols data-action='toggleCategory' data-ipsTooltip title='{lang="toggle_this_category"}'><i></i><span class='ipsInvisible'>{lang="toggle_this_category"}</span></button>
|
|
</h2>
|
|
<div class='ipsBox__content'>
|
|
{{if \IPS\Member::loggedIn()->getLayoutValue('forums_forum') === 'grid'}}
|
|
<i-data>
|
|
<ol class='ipsData ipsData--grid ipsData--forum-grid ipsBox__content' id='forum-category_clubs' data-ips-hidden-animation="slide" data-ips-hidden-event="ips:toggleForumCategory">
|
|
{{foreach $clubForums as $forum}}
|
|
{template="forumGridItem" group="index" app="forums" params="$forum"}
|
|
{{endforeach}}
|
|
</ol>
|
|
</i-data>
|
|
{{elseif \IPS\Member::loggedIn()->getLayoutValue('forums_forum') === 'modern'}}
|
|
<div class='ipsCategoryWithFeed ipsBox__content' id='forum-category_clubs' data-ips-hidden-animation="slide" data-ips-hidden-event="ips:toggleForumCategory">
|
|
{{foreach $clubForums as $forum}}
|
|
{template="forumSummaryRow" group="index" app="forums" params="$forum"}
|
|
{{endforeach}}
|
|
</div>
|
|
{{else}}
|
|
<i-data>
|
|
<ol class="ipsData ipsData--table ipsData--category ipsData--forum-category ipsBox__content" id='forum-category_clubs' data-ips-hidden-animation="slide" data-ips-hidden-event="ips:toggleForumCategory">
|
|
{{foreach $clubForums as $forum}}
|
|
{template="forumRow" group="index" app="forums" params="$forum"}
|
|
{{endforeach}}
|
|
</ol>
|
|
</i-data>
|
|
{{endif}}
|
|
</div>
|
|
</li>
|
|
{{endif}}
|
|
</ol>
|
|
</section>]]></template>
|
|
<template template_group="index" template_name="indexButtons" template_data="$showViewButtons=TRUE, $showFilterButton=FALSE" template_location="front" template_app="forums"><![CDATA[
|
|
{{if $showFilterButton}}
|
|
<div class='ipsPageHeader__row ipsResponsive_hideDesktop'>
|
|
<ul class='ipsButtons ipsButtons--fill'>
|
|
<li>
|
|
<a class="ipsButton ipsButton--inherit" href="#" rel="nofollow" data-ipsDialog data-ipsDialog-title='{lang="forums_simple_dialog_title"}' data-ipsDialog-content='#elFluidFormFilters'>
|
|
<span data-role='fluidForumMobileDesc'>{lang="forums_simple_filter_by"}</span><i class='fa-solid fa-angle-down'></i>
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
{{endif}}]]></template>
|
|
<template template_group="index" template_name="simplifiedForumTable" template_data="$table, $headers, $rows, $quickSearch" template_location="front" template_app="forums"><![CDATA[<div data-ips-hook="fluidTable" class='ipsBox ipsPull cForumFluidTable' data-baseurl='{$table->baseUrl}' data-resort='{$table->resortKey}' data-tableID='topics' data-dummyLoading data-controller='core.global.core.table{{if $table->canModerate()}},core.front.core.moderation{{endif}}'>
|
|
{{if $table->title}}
|
|
<h2 hidden>{$table->title}</h2>
|
|
{{endif}}
|
|
|
|
{{if $table->count > 0}}
|
|
<div data-ips-hook="buttonBar" class="ipsButtonBar ipsButtonBar--top">
|
|
<div data-role="tablePagination" class="ipsButtonBar__pagination" {{if $table->pages <= 1}}hidden{{endif}}>
|
|
{template="pagination" group="global" app="core" location="global" params="$table->baseUrl, $table->pages, $table->page, $table->limit, TRUE, $table->getPaginationKey()"}
|
|
</div>
|
|
<div class="ipsButtonBar__end">
|
|
<ul class="ipsDataFilters">
|
|
{{if isset( $table->sortOptions ) and !empty( $table->sortOptions ) }}
|
|
<li>
|
|
<a href="#elSortByMenu_menu" id="elSortByMenu_{$table->uniqueId}" data-role='sortButton' data-ipsMenu data-ipsMenu-activeClass="ipsDataFilters__button--active" data-ipsMenu-selectable="radio" class="ipsDataFilters__button"><span>{lang="sort_by"}</span><i class="fa-solid fa-caret-down"></i></a>
|
|
<ul class="ipsMenu ipsMenu_auto ipsMenu_withStem ipsMenu_selectable ipsHide" id="elSortByMenu_{$table->uniqueId}_menu">
|
|
{{$custom = TRUE;}}
|
|
{{foreach $table->sortOptions as $k => $col}}
|
|
<li class="ipsMenu_item {{if $col === $table->getSortByColumn()}}{{$custom = FALSE;}}ipsMenu_itemChecked{{endif}}" data-ipsMenuValue="{$col}" data-sortDirection='{$table->getSortDirection( $col )}'><a href="{$table->baseUrl->setQueryString( array( 'filter' => $table->filter, 'sortby' => $col, 'sortdirection' => $table->getSortDirection( $col ) ) )->setPage( 'page', 1 )}" rel="nofollow">{lang="{$table->langPrefix}sort_{$k}"}</a></li>
|
|
{{endforeach}}
|
|
{{if $table->advancedSearch}}
|
|
<li class="ipsMenu_item {{if $custom}}ipsMenu_itemChecked{{endif}}" data-noSelect="true">
|
|
<a href='{$table->baseUrl->setQueryString( array( 'advancedSearchForm' => '1', 'filter' => $table->filter, 'sortby' => $table->sortBy, 'sortdirection' => $table->sortDirection ) )}' data-ipsDialog data-ipsDialog-title='{lang="custom_sort"}' rel="nofollow">{lang="custom"}</a>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
</li>
|
|
{{endif}}
|
|
{{if !empty( $table->filters )}}
|
|
<li>
|
|
<a href="#elFilterByMenu_menu" id="elFilterByMenu_{$table->uniqueId}" data-role='tableFilterMenu' data-ipsMenu data-ipsMenu-activeClass="ipsDataFilters__button--active" data-ipsMenu-selectable="radio" class="ipsDataFilters__button"><span>{lang="filter_by"}</span><i class="fa-solid fa-caret-down"></i></a>
|
|
<ul class='ipsMenu ipsMenu_auto ipsMenu_withStem ipsMenu_selectable ipsHide' data-role="tableFilterMenu" id='elFilterByMenu_{$table->uniqueId}_menu'>
|
|
<li data-action="tableFilter" data-ipsMenuValue='' class='ipsMenu_item {{if !$table->filter}}ipsMenu_itemChecked{{endif}}'>
|
|
<a href='{$table->baseUrl->setQueryString( array( 'filter' => '', 'sortby' => $table->sortBy, 'sortdirection' => $table->sortDirection ) )->setPage( 'page', 1 )}' rel="nofollow">{lang="{$table->langPrefix}all"}</a>
|
|
</li>
|
|
{{foreach $table->filters as $k => $q}}
|
|
<li data-action="tableFilter" data-ipsMenuValue='{$k}' class='ipsMenu_item {{if $k === $table->filter}}ipsMenu_itemChecked{{endif}}'>
|
|
<a href='{$table->baseUrl->setQueryString( array( 'filter' => $k, 'sortby' => $table->sortBy, 'sortdirection' => $table->sortDirection) )->setPage( 'page', 1 )}' rel="nofollow">{lang="{$table->langPrefix}{$k}"}</a>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</li>
|
|
{{endif}}
|
|
{{if $table->canModerate()}}
|
|
<li>
|
|
<a class="ipsJS_show ipsDataFilters__button" href="#elCheck_menu" id="elCheck_{$table->uniqueId}" title='{lang="{$table->langPrefix}select_rows_tooltip"}' data-ipsTooltip data-ipsAutoCheck data-ipsAutoCheck-context="#elTable_{$table->uniqueId}" data-ipsMenu data-ipsMenu-activeClass="ipsDataFilters__button--active">
|
|
<span class="cAutoCheckIcon"><i class="fa-regular fa-square"></i></span><i class="fa-solid fa-caret-down"></i>
|
|
<span class='ipsNotification' data-role='autoCheckCount'>0</span>
|
|
</a>
|
|
<ul class="ipsMenu ipsMenu_auto ipsMenu_withStem ipsHide" id="elCheck_{$table->uniqueId}_menu">
|
|
<li class="ipsMenu_title">{lang="{$table->langPrefix}select_rows"}</li>
|
|
<li class="ipsMenu_item" data-ipsMenuValue="all"><a href="#">{lang="all"}</a></li>
|
|
<li class="ipsMenu_item" data-ipsMenuValue="none"><a href="#">{lang="none"}</a></li>
|
|
{{if \count($table->getFilters())}}
|
|
<li class="ipsMenu_sep"><hr></li>
|
|
{{foreach $table->getFilters() as $filter}}
|
|
<li class="ipsMenu_item" data-ipsMenuValue="{$filter}"><a href="#">{lang="$filter"}</a></li>
|
|
{{endforeach}}
|
|
{{endif}}
|
|
</ul>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
{{if $table->canModerate()}}
|
|
<form action="{$table->baseUrl->csrf()}" method="post" data-role='moderationTools' data-ipsPageAction>
|
|
{{endif}}
|
|
{{if \count( $rows )}}
|
|
<i-data>
|
|
<ol class='ipsData {{if \IPS\Member::loggedIn()->getLayoutValue('forums_topic') == 'snippet'}}ipsData--snippet-topic-list{{else}}ipsData--table ipsData--entries ipsData--table-topic-list{{endif}} {{foreach $table->classes as $class}}{$class} {{endforeach}}' data-ips-hook="rows" id='elTable_{$table->uniqueId}' data-role="tableRows">
|
|
{template="$table->rowsTemplate[1]" params="$table, $headers, $rows" object="$table->rowsTemplate[0]"}
|
|
</ol>
|
|
</i-data>
|
|
{{else}}
|
|
<div class='i-text-align_center ipsBox__padding'>
|
|
<p class='i-font-size_3 i-font-weight_500'>{lang="no_topics_in_forum"}</p>
|
|
</div>
|
|
{{endif}}
|
|
{{if $table->canModerate()}}
|
|
<div class="ipsJS_hide ipsData__modBar" data-role="pageActionOptions">
|
|
<select name="modaction" data-role="moderationAction" class="ipsInput ipsInput--select i-basis_300">
|
|
{{if $table->canModerate('unhide')}}
|
|
<option value='approve' data-icon='check-circle'>{lang="approve"}</option>
|
|
{{endif}}
|
|
{{if $table->canModerate('feature') or $table->canModerate('unfeature')}}
|
|
<optgroup label="{lang="feature"}" data-icon='star' data-action='feature'>
|
|
{{if $table->canModerate('feature')}}
|
|
<option value='feature'>{lang="feature"}</option>
|
|
{{endif}}
|
|
{{if $table->canModerate('unhide')}}
|
|
<option value='unfeature'>{lang="unfeature"}</option>
|
|
{{endif}}
|
|
</optgroup>
|
|
{{endif}}
|
|
{{if $table->canModerate('pin') or $table->canModerate('unpin')}}
|
|
<optgroup label="{lang="pin"}" data-icon='thumb-tack' data-action='pin'>
|
|
{{if $table->canModerate('pin')}}
|
|
<option value='pin'>{lang="pin"}</option>
|
|
{{endif}}
|
|
{{if $table->canModerate('unpin')}}
|
|
<option value='unpin'>{lang="unpin"}</option>
|
|
{{endif}}
|
|
</optgroup>
|
|
{{endif}}
|
|
{{if $table->canModerate('hide') or $table->canModerate('unhide')}}
|
|
<optgroup label="{lang="hide"}" data-icon='eye' data-action='hide'>
|
|
{{if $table->canModerate('hide')}}
|
|
<option value='hide'>{lang="hide"}</option>
|
|
{{endif}}
|
|
{{if $table->canModerate('unhide')}}
|
|
<option value='unhide'>{lang="unhide"}</option>
|
|
{{endif}}
|
|
</optgroup>
|
|
{{endif}}
|
|
{{if $table->canModerate('lock') or $table->canModerate('unlock')}}
|
|
<optgroup label="{lang="lock"}" data-icon='lock' data-action='lock'>
|
|
{{if $table->canModerate('lock')}}
|
|
<option value='lock'>{lang="lock"}</option>
|
|
{{endif}}
|
|
{{if $table->canModerate('unlock')}}
|
|
<option value='unlock'>{lang="unlock"}</option>
|
|
{{endif}}
|
|
</optgroup>
|
|
{{endif}}
|
|
{{if $table->canModerate('move')}}
|
|
<option value='move' data-icon='arrow-right'>{lang="move"}</option>
|
|
{{endif}}
|
|
{{if $table->canModerate('split_merge')}}
|
|
<option value='merge' data-icon='level-up'>{lang="merge"}</option>
|
|
{{endif}}
|
|
{{if $table->canModerate('delete')}}
|
|
<option value='delete' data-icon='trash'>{lang="delete"}</option>
|
|
{{endif}}
|
|
{{if $table->canModerate( 'tag' )}}
|
|
<optgroup label='{lang="tag"}' data-icon='tag' data-action='tag'>
|
|
<option value='tag'>{lang="add_single_tag"}</option>
|
|
<option value='untag'>{lang="remove_single_tag"}</option>
|
|
</optgroup>
|
|
{{endif}}
|
|
{{if $table->savedActions}}
|
|
<optgroup label="{lang="saved_actions"}" data-icon='tasks' data-action='saved_actions'>
|
|
{{foreach $table->savedActions as $k => $v}}
|
|
<option value='savedAction-{$k}'>{$v}</option>
|
|
{{endforeach}}
|
|
</optgroup>
|
|
{{endif}}
|
|
</select>
|
|
<button type="submit" class="ipsButton ipsButton--primary">{lang="submit"}</button>
|
|
</div>
|
|
</form>
|
|
{{endif}}
|
|
<div class="ipsButtonBar ipsButtonBar--bottom" {{if $table->pages <= 1}}hidden{{endif}}>
|
|
<div class='ipsButtonBar__pagination' data-role="tablePagination">
|
|
{template="pagination" group="global" app="core" location="global" params="$table->baseUrl, $table->pages, $table->page, $table->limit, TRUE, $table->getPaginationKey()"}
|
|
</div>
|
|
</div>
|
|
</div>]]></template>
|
|
<template template_group="index" template_name="simplifiedTopicRow" template_data="$table, $headers, $rows" template_location="front" template_app="forums"><![CDATA[{{$rowIds = array();}}
|
|
{{foreach $rows as $row}}
|
|
{{$idField = $row::$databaseColumnId;}}
|
|
{{$rowIds[] = $row->$idField;}}
|
|
{{endforeach}}
|
|
{{if \count( $rows )}}
|
|
{{$rowCount=1; $adShown=0;}}
|
|
{{foreach $rows as $row}}
|
|
{{if $advertisement = \IPS\core\Advertisement::loadByLocation( 'ad_forum_listing', $rowCount, $adShown )}}
|
|
<li class="ipsData__item ipsData__item--advertisement">
|
|
{$advertisement|raw}
|
|
{{$adShown++;}}
|
|
</li>
|
|
{{endif}}
|
|
{{$rowCount++;}}
|
|
{{$idField = $row::$databaseColumnId;}}
|
|
{{if $row->mapped('moved_to')}}
|
|
{{if $movedTo = $row->movedTo() AND $movedTo->container()->can('view')}}
|
|
<li class="ipsData__item" data-controller="cloud.front.realtime.forumsTopicRow">
|
|
<a href='{$movedTo->url( "getPrefComment" )}' class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{$row->mapped('title')}</span></a>
|
|
<div class='ipsData__icon ipsData__icon--indicator'>
|
|
<i class="fa-solid fa-arrow-left"></i>
|
|
</div>
|
|
<div class='ipsData__content'>
|
|
<div class='ipsData__main'>
|
|
<div class='ipsData__title'><h4><em><a href='{$movedTo->url( "getPrefComment" )}' title='{lang="go_to_new_location"}'>{$row->mapped('title')}</a></em></h4></div>
|
|
<div class='ipsData__meta'>
|
|
{{if isset( $row::$databaseColumnMap['status'] )}}
|
|
{{$statusField = $row::$databaseColumnMap['status'];}}
|
|
{{if $row->$statusField == 'merged'}}
|
|
<p>{lang="topic_merged_to" sprintf="$movedTo->url( 'getPrefComment' ), $movedTo->mapped('title')"}</p>
|
|
{{else}}
|
|
<p>{lang="topic_moved_to" sprintf="$movedTo->container()->url(), $movedTo->container()->_title"}</p>
|
|
{{endif}}
|
|
{{else}}
|
|
<p>{lang="topic_moved_to" sprintf="$movedTo->container()->url(), $movedTo->container()->_title"}</p>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{{if $table->canModerate()}}
|
|
<div class='ipsData__mod'>
|
|
<input type='checkbox' data-role='moderation' name="moderate[{$row->$idField}]" data-actions="{{if $row->mapped('featured')}}unfeature{{endif}} {{if $row->mapped('pinned')}}unpin{{endif}} delete" data-state='{{if $row->mapped('pinned')}}pinned{{endif}} {{if $row->mapped('featured')}}featured{{endif}}' class="ipsInput ipsInput--toggle">
|
|
</div>
|
|
{{endif}}
|
|
</li>
|
|
{{endif}}
|
|
{{else}}
|
|
<li data-ips-hook="row" class="ipsData__item {{if method_exists( $row, 'tableClass' ) && $row->tableClass()}}ipsData__item--{$row->tableClass()}{{endif}} {{if $row->hidden() or $row->isFutureDate()}}ipsModerated{{endif}}{{if $row->isFutureDate()}} ipsData__item--future{{endif}}" {template="formattedInlineStyle" params="$row->container()" app="core" group="global" location="front"} data-rowID='{$row->$idField}' {{if isset($row->locationHash)}}data-location='{$row->locationHash}'{{endif}} {{if $row->unread()}}data-ips-unread{{else}}data-ips-read{{endif}}>
|
|
<a href='{$row->url( "getPrefComment" )}' class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{{if $row->mapped('title') or $row->mapped('title') == 0}}{$row->mapped('title')}{{else}}{lang="content_deleted"}{{endif}}</span></a>
|
|
{{if member.member_id}}
|
|
{{if $row->unread()}}
|
|
<!-- <a href='{$row->url( "getNewComment" )}' class="ipsIndicator {{if \in_array( $row->$idField, $table->contentPostedIn )}}ipsIndicator--participated{{endif}}" aria-label='{lang="first_unread_post"}' data-ipsTooltip data-ips-hook="unreadIcon"></a> -->
|
|
{{else}}
|
|
<!-- <span class='ipsIndicator ipsIndicator--read {{if \in_array( $row->$idField, $table->contentPostedIn )}}ipsIndicator--participated{{endif}}' aria-hidden='true' data-ips-hook="unreadIcon"></span> -->
|
|
{{endif}}
|
|
{{endif}}
|
|
{{if member.member_id and $row->unread()}}
|
|
<a href='{$row->url( "getNewComment" )}' class="ipsData__icon" aria-label='{lang="first_unread_post"}' data-ipsTooltip data-ips-hook="unreadIcon">
|
|
<span class="ipsUserPhoto">
|
|
<img src="{$row->author()->photo}" alt="" loading="lazy">
|
|
</span>
|
|
{{if $row->author() != \IPS\Member::loggedIn() and \in_array( $row->$idField, $table->contentPostedIn )}}
|
|
<span class="ipsUserPhoto">
|
|
<img src='{expression="\IPS\Member::loggedIn()->photo"}' alt='' loading="lazy">
|
|
</span>
|
|
{{endif}}
|
|
</a>
|
|
{{else}}
|
|
<div class="ipsData__icon">
|
|
<span class="ipsUserPhoto">
|
|
<img src="{$row->author()->photo}" alt="" loading="lazy">
|
|
</span>
|
|
{{if $row->author() != \IPS\Member::loggedIn() and \in_array( $row->$idField, $table->contentPostedIn )}}
|
|
<span class="ipsUserPhoto">
|
|
<img src='{expression="\IPS\Member::loggedIn()->photo"}' alt='' loading="lazy">
|
|
</span>
|
|
{{endif}}
|
|
</div>
|
|
{{endif}}
|
|
<div class='ipsData__content'>
|
|
<div class='ipsData__main'>
|
|
<div class='ipsData__title'>
|
|
{{if member.member_id and $row->unread()}}
|
|
<a href='{$row->url( "getNewComment" )}' class="ipsIndicator" aria-label='{lang="first_unread_post"}' data-ipsTooltip data-ips-hook="unreadIcon"></a>
|
|
{{endif}}
|
|
<h4 data-ips-hook="title">
|
|
<a href='{$row->url( "getPrefComment" )}' title="{{if $row->mapped('title')}}{$row->mapped('title')}{{else}}{lang='content_deleted'}{{endif}} {{if $row->canEdit()}}{lang='click_hold_edit'}{{endif}}" {{if $row->tableHoverUrl and $row->canView()}} data-ipsHover data-ipsHover-target='{$row->url()->setQueryString('preview', 1)}' data-ipsHover-timeout='1.5'{{endif}}{{if $row->canEdit()}} data-role="editableTitle"{{endif}}>
|
|
<span>
|
|
{{if $row->mapped('title') or $row->mapped('title') == 0}}{$row->mapped('title')}{{else}}<em class="i-color_soft">{lang="content_deleted"}</em>{{endif}}
|
|
</span>
|
|
</a>
|
|
</h4>
|
|
{{if $row->commentPageCount() > 1}}
|
|
{$row->commentPagination( array(), 'miniPagination' )|raw}
|
|
{{endif}}
|
|
<div data-ips-hook="badges" class="ipsBadges">
|
|
{{foreach $row->badges() as $badge}}{$badge|raw}{{endforeach}}
|
|
</div>
|
|
</div>
|
|
<div data-ips-hook="description" class='ipsData__meta'>
|
|
<div data-ips-hook="badges" class="ipsBadges">
|
|
{{if $row->prefix()}}
|
|
{template="prefix" group="global" app="core" params="$row->prefix( TRUE ), $row->prefix()"}
|
|
{{endif}}
|
|
</div>
|
|
{lang="byline_itemprop" htmlsprintf="$row->author()->link( NULL, NULL, $row->isAnonymous() )"}
|
|
{datetime="$row->mapped('date')" lowercase="true"}
|
|
{lang="in"} <a href="{$row->container()->url()}" class="ipsData__container-title">{{if $club = $row->container()->club()}}{lang="club_node" sprintf="$club->name, $row->container()->_title"}{{else}}{$row->container()->_title|raw}{{endif}}</a>
|
|
</div>
|
|
{{if \count( $row->tags() )}}
|
|
{template="tags" group="global" app="core" params="$row->tags(), true"}
|
|
{{endif}}
|
|
</div>
|
|
{{if $row->groupsPosted}}
|
|
{template="groupPostedBadges" group="global" app="core" location="front" params="$row->groupsPosted, 'topic_posted_in_groups'"}
|
|
{{endif}}
|
|
<div class="ipsData__extra">
|
|
<ul data-ips-hook="stats" class='ipsData__stats'>
|
|
{{foreach $row->stats(FALSE) as $k => $v}}
|
|
<li {{if $k == 'num_views'}}class='ipsData__stats-soft i-color_soft'{{elseif \in_array( $k, $row->hotStats )}}class="ipsData__stats-hot" data-text='{lang="hot_item"}' data-ipsTooltip title='{lang="hot_item_desc"}'{{endif}}>
|
|
<span class='ipsData__stats-icon' data-stat-value="{number='$v' format='short'}" aria-hidden="true" data-ipstooltip title='{number="$v" format="short"} {lang="{$k}" pluralize="$v" format="short"}'></span>
|
|
<span class='ipsData__stats-label'>{number="$v" format="short"} {lang="{$k}" pluralize="$v" format="short"}</span>
|
|
{{if ( $k == 'forums_comments' OR $k == 'answers_no_number' ) && \IPS\forums\Topic::modPermission( 'unhide', NULL, $row->container() ) AND $unapprovedComments = $row->mapped('unapproved_comments')}}
|
|
<a href='{$row->url()->setQueryString( 'queued_posts', 1 )}' class='i-color_warning i-font-size_-2' data-ipsTooltip title='{lang="queued_posts_badge" pluralize="$row->topic_queuedposts"}'><i class='fa-solid fa-triangle-exclamation'></i> <strong>{$unapprovedComments}</strong></a>
|
|
{{endif}}
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
<div data-ips-hook="latestPoster" class="ipsData__last">
|
|
{template="userPhoto" app="core" group="global" params="$row->lastCommenter(), 'fluid'"}
|
|
<div class="ipsData__last-text">
|
|
<div class="ipsData__last-primary">
|
|
{{if $row->mapped('num_comments')}}
|
|
{$row->lastCommenter()->link()|raw}
|
|
{{else}}
|
|
{$row->author()->link()|raw}
|
|
{{endif}}
|
|
</div>
|
|
<div class="ipsData__last-secondary">
|
|
<a href='{$row->url( 'getLastComment' )}' title='{lang="get_last_post"}'>
|
|
{{if $row->mapped('last_comment')}}{datetime="$row->mapped('last_comment')"}{{else}}{datetime="$row->mapped('date')"}{{endif}}
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{{if $table->canModerate()}}
|
|
<div class='ipsData__mod'>
|
|
<input type='checkbox' class="ipsInput ipsInput--toggle" data-role='moderation' name="moderate[{$row->$idField}]" data-actions="{expression="implode( ' ', $table->multimodActions( $row ) )"}" data-state='{{if $row->tableStates()}}{$row->tableStates()}{{endif}}'>
|
|
</div>
|
|
{{endif}}
|
|
</li>
|
|
{{endif}}
|
|
{{if $advertisement = \IPS\core\Advertisement::loadByLocation( 'ad_fluid_index_view', $rowCount, $adShown )}}
|
|
<li class="ipsData__item ipsData__item--advertisement">{$advertisement|raw}</li>
|
|
{{$adShown++;}}
|
|
{{endif}}
|
|
{{endforeach}}
|
|
{{endif}}]]></template>
|
|
<template template_group="index" template_name="simplifiedTopicRowSnippet" template_data="$table, $headers, $rows" template_location="front" template_app="forums"><![CDATA[{{$rowIds = array();}}
|
|
{{foreach $rows as $row}}
|
|
{{$idField = $row::$databaseColumnId;}}
|
|
{{$rowIds[] = $row->$idField;}}
|
|
{{endforeach}}
|
|
{{if \count( $rows )}}
|
|
{{$rowCount=1; $adShown=0;}}
|
|
{{foreach $rows as $row}}
|
|
{{if $advertisement = \IPS\core\Advertisement::loadByLocation( 'ad_forum_listing', $rowCount, $adShown )}}
|
|
<li class="ipsData__item ipsData__item--advertisement">
|
|
{$advertisement|raw}
|
|
{{$adShown++;}}
|
|
</li>
|
|
{{endif}}
|
|
{{$rowCount++;}}
|
|
{{$idField = $row::$databaseColumnId;}}
|
|
{{if $row->mapped('moved_to')}}
|
|
{{if $movedTo = $row->movedTo() AND $movedTo->container()->can('view')}}
|
|
<li data-ips-hook="movedRow" class="ipsData__item ipsData__item--snippet">
|
|
<a href='{$movedTo->url()}' class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{$row->mapped('title')}</span></a>
|
|
<div class='ipsData__icon ipsData__icon--indicator'>
|
|
<i class="fa-solid fa-arrow-left"></i>
|
|
</div>
|
|
<div class='ipsData__content'>
|
|
<div class='ipsData__main'>
|
|
<div class='ipsData__title'>
|
|
<h4 data-ips-hook="movedTitle"><a href='{$movedTo->url()}' title='{lang="go_to_new_location"}'>{$row->mapped('title')}</a></h4>
|
|
</div>
|
|
<p class='ipsData__meta'>
|
|
{{if isset( $row::$databaseColumnMap['status'] )}}
|
|
{{$statusField = $row::$databaseColumnMap['status'];}}
|
|
{{if $row->$statusField == 'merged'}}
|
|
{lang="topic_merged_to" sprintf="$movedTo->url( 'getPrefComment' ), $movedTo->mapped('title')"}
|
|
{{else}}
|
|
{lang="topic_moved_to" sprintf="$movedTo->container()->url(), $movedTo->container()->_title"}
|
|
{{endif}}
|
|
{{else}}
|
|
{lang="topic_moved_to" sprintf="$movedTo->container()->url(), $movedTo->container()->_title"}
|
|
{{endif}}
|
|
</p>
|
|
</div>
|
|
</div>
|
|
{{if $table->canModerate()}}
|
|
<div class='ipsData__mod'>
|
|
<input type='checkbox' data-role='moderation' name="moderate[{$row->$idField}]" data-actions="{{if $row->mapped('featured')}}unfeature{{endif}} {{if $row->mapped('pinned')}}unpin{{endif}} delete" data-state='{{if $row->mapped('pinned')}}pinned{{endif}} {{if $row->mapped('featured')}}featured{{endif}}' class="ipsInput ipsInput--toggle">
|
|
</div>
|
|
{{endif}}
|
|
</li>
|
|
{{endif}}
|
|
{{else}}
|
|
<li data-ips-hook="row" data-controller="cloud.front.realtime.forumsTopicRow" class="ipsData__item ipsData__item--snippet {{if $row->groupsPosted}}ipsData__item--highlighted{{endif}} {{if method_exists( $row, 'tableClass' ) && $row->tableClass()}}ipsData__item--{$row->tableClass()}{{endif}} {{if $row->hidden() or $row->isFutureDate()}}ipsModerated{{endif}}{{if $row->isFutureDate()}} ipsModerated--alternate{{endif}}" data-rowID='{$row->$idField}' {{if isset($row->locationHash)}}data-location='{$row->locationHash}'{{endif}}' {{if $row->unread()}}data-ips-unread{{else}}data-ips-read{{endif}}>
|
|
<a href='{$row->url( "getPrefComment" )}' class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{$row->mapped('title')}</span></a>
|
|
<div class='ipsData__icon'>
|
|
{template="userPhoto" app="core" group="global" params="$row->author(), 'fluid'"}
|
|
</div>
|
|
<div class='ipsData__content'>
|
|
<div class='ipsData__main'>
|
|
<div class="ipsColumns">
|
|
<div class="ipsColumns__primary">
|
|
<div class='ipsData__title'>
|
|
<div data-ips-hook="badges" class="ipsBadges">
|
|
{{foreach $row->badges() as $badge}}{$badge|raw}{{endforeach}}
|
|
{{if $row->prefix()}}
|
|
{template="prefix" group="global" app="core" params="$row->prefix( TRUE ), $row->prefix()"}
|
|
{{endif}}
|
|
</div>
|
|
{{if member.member_id}}
|
|
{{if $row->unread()}}
|
|
<a href="{$row->url( 'getNewComment' )}" class="ipsIndicator {{if \in_array( $row->$idField, $table->contentPostedIn )}}ipsIndicator--participated{{endif}}" aria-label='{lang="first_unread_post"}' data-ipsTooltip data-ips-hook="unreadIcon"></a>
|
|
{{else}}
|
|
<span class='ipsIndicator ipsIndicator--read {{if \in_array( $row->$idField, $table->contentPostedIn )}}ipsIndicator--participated{{endif}}' aria-hidden='true'></span>
|
|
{{endif}}
|
|
{{endif}}
|
|
<h4 data-ips-hook="title">
|
|
<a href='{$row->url( "getPrefComment" )}' title='{{if $row->mapped('title')}}{$row->mapped('title')}{{else}}{lang="content_deleted"}{{endif}} {{if $row->canEdit()}}{lang="click_hold_edit"}{{endif}}' {{if $row->tableHoverUrl and $row->canView()}} data-ipsHover data-ipsHover-target='{$row->url()->setQueryString('preview', 1)}' data-ipsHover-timeout='1.5'{{endif}}{{if $row->canEdit()}} data-role="editableTitle"{{endif}}>
|
|
<span>
|
|
{{if $row->mapped('title') or $row->mapped('title') == 0}}{$row->mapped('title')}{{else}}<em class="i-color_soft">{lang="content_deleted"}</em>{{endif}}
|
|
</span>
|
|
</a>
|
|
</h4>
|
|
{{if $row->commentPageCount() > 1}}
|
|
{$row->commentPagination( array(), 'miniPagination' )|raw}
|
|
{{endif}}
|
|
</div>
|
|
<div class='ipsData__meta i-font-weight_500'><a href="{$row->container()->url()}">{$row->container()->_formattedTitle|raw}</a> · {lang="topic_started_username_date" htmlsprintf="$row->author()->link( NULL, NULL, $row->isAnonymous() ), \IPS\DateTime::ts( $row->mapped('date') )->html( false )"}</div>
|
|
</div>
|
|
<div class="ipsColumns__secondary">
|
|
{{if \count( $row->tags() )}}
|
|
{template="tags" group="global" app="core" params="$row->tags(), true"}
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
{{if isset($row->firstComment)}}
|
|
<p data-ips-hook="snippet" class='ipsData__desc'>{$row->firstComment->snippet(680)}</p>
|
|
{{endif}}
|
|
<div class='ipsData__extra'>
|
|
<ul data-ips-hook="stats" class='ipsData__stats'>
|
|
<li>
|
|
{template="reactionOverview" group="global" app="core" params="$row, NULL, NULL"}
|
|
</li>
|
|
{{foreach $row->stats(FALSE) as $k => $v}}
|
|
<li {{if $k == 'num_views'}} {{elseif \in_array( $k, $row->hotStats )}}class="ipsData__stats-hot" data-text='{lang="hot_item"}' data-ipsTooltip title='{lang="hot_item_desc"}'{{endif}} data-statType='{$k}' {{if $v === 0}}data-v="0"{{endif}}>
|
|
<span class='ipsData__stats-icon' data-stat-value="{number='$v' format='short'}" aria-hidden="true" data-ipstooltip title='{number="$v" format="short"} {lang="{$k}" pluralize="$v" format="short"}'></span>
|
|
<span class='ipsData__stats-label'>{number="$v" format="short"} {lang="{$k}" pluralize="$v" format="short"}</span>
|
|
{{if ( $k == 'forums_comments' OR $k == 'answers_no_number' ) && \IPS\forums\Topic::modPermission( 'unhide', NULL, $row->container() ) AND $unapprovedComments = $row->mapped('unapproved_comments')}}
|
|
<a href='{$row->url()->setQueryString( 'queued_posts', 1 )}' class='i-color_warning i-font-size_-2' data-ipsTooltip title='{lang="queued_posts_badge" pluralize="$row->topic_queuedposts"}'><i class='fa-solid fa-triangle-exclamation'></i> <strong>{$unapprovedComments}</strong></a>
|
|
{{endif}}
|
|
</li>
|
|
{{endforeach}}
|
|
{{if $row->followerCount}}
|
|
<li>
|
|
<a href='{url="app=core&module=system&controller=notifications&do=followers&follow_app=forums&follow_area=topic&follow_id={$row->tid}"}' rel="nofollow" title='{lang="followers_tooltip"}' data-ipsTooltip data-ipsDialog data-ipsDialog-size='narrow' data-ipsDialog-title='{lang="who_follows_this"}'>{lang="topic_follower_count" pluralize="$row->followerCount"}</a>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
<div data-ips-hook="latestPoster" class="ipsData__last">
|
|
{{if $row->mapped('num_comments')}}
|
|
{template="userPhoto" app="core" group="global" params="$row->lastCommenter(), 'fluid'"}
|
|
<div class="ipsData__last-text">
|
|
<div class='ipsData__last-primary'>
|
|
{lang="topic_snippet_last_reply" htmlsprintf="$row->lastCommenter()->link(), $row->url( 'getLastComment' ), \IPS\DateTime::ts( $row->mapped('last_comment') )->html( false )"}
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{{if $table->canModerate()}}
|
|
<div class='ipsData__mod'>
|
|
<input type='checkbox' data-role='moderation' name="moderate[{$row->$idField}]" data-actions="{expression="implode( ' ', $table->multimodActions( $row ) )"}" data-state='{{if $row->tableStates()}}{$row->tableStates()}{{endif}}' class="ipsInput ipsInput--toggle">
|
|
</div>
|
|
{{endif}}
|
|
</li>
|
|
{{endif}}
|
|
{{if $advertisement = \IPS\core\Advertisement::loadByLocation( 'ad_fluid_index_view', $rowCount, $adShown )}}
|
|
<li class="ipsData__item ipsData__item--advertisement">{$advertisement|raw}</li>
|
|
{{$adShown++;}}
|
|
{{endif}}
|
|
{{endforeach}}
|
|
{{endif}}]]></template>
|
|
<template template_group="index" template_name="simplifiedView" template_data="$table" template_location="front" template_app="forums"><![CDATA[<header class="ipsPageHeader ipsPageHeader--forum-fluid">
|
|
<div class="ipsPageHeader__row">
|
|
<div data-ips-hook="header" class='ipsPageHeader__primary'>
|
|
<h1 data-ips-hook="title" class='ipsPageHeader__title'>
|
|
{lang="topics"}
|
|
</h1>
|
|
</div>
|
|
<ul class='ipsButtons ipsButtons--main'>
|
|
{{if \IPS\forums\Forum::canOnAny( 'add' )}}
|
|
<li>
|
|
<a class="ipsButton ipsButton--primary" href="{url="app=forums&module=forums&controller=forums&do=add" seoTemplate="topic_non_forum_add_button"}" rel="nofollow" data-ipsDialog data-ipsDialog-size='narrow' data-ipsDialog-title='{lang="select_forum"}'><i class="fa-regular fa-pen-to-square"></i><span>{lang="start_new_topic"}</span></a>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
</div>
|
|
{template="indexButtons" group="index" app="forums" params="FALSE, TRUE"}
|
|
</header>
|
|
|
|
{$table|raw}]]></template>
|
|
<template template_group="index" template_name="simplifiedViewForumSidebar" template_data="$forum, $depth=0" template_location="front" template_app="forums"><![CDATA[<div data-controller="forums.front.forum.flow" data-rootForum="{$forum->_id}" class='ipsWidget cForumMiniList_wrapper' id='elFluidFormFilters'>
|
|
<ul class='cForumMiniList cForumMiniList_multiRoot'>
|
|
<li class="cForumMiniList__category" data-category>
|
|
{{if $forum->sub_can_post}}
|
|
{{$lastPost = $forum->lastPost();}}
|
|
{{$unread = \IPS\forums\Topic::containerUnread( $forum );}}
|
|
{{$children = $forum->children();}}
|
|
<a href="{$forum->url()}" data-parent-id="{$forum->_id}" data-node-id="{$forum->_id}" data-has-children="1" {{if $unread}}data-ips-unread{{else}}data-ips-read{{endif}} {{if $forum->feature_color}}style="--i-featured: {$forum->feature_color}; --i-featured-text: {$forum->_featureTextColor};"{{endif}}>
|
|
<span class='cForumMiniList__blob' {{if $lastPost AND $lastPost['date']}}title="{lang="forum_simple_view_last_post"} {datetime="$lastPost['date']"}" data-ipsTooltip data-ipsTooltip-safe{{endif}}>
|
|
<i class='fa-solid fa-check'></i>
|
|
</span>
|
|
<span class='cForumMiniList__title'>{$forum->_title}</span>
|
|
<span class='cForumMiniList__count'>{number="\IPS\forums\Topic::contentCountItemsOnly( $forum )" format="short"}</span>
|
|
</a>
|
|
{{else}}
|
|
<a href="{$forum->url()}" data-parent-id="{$forum->_id}" data-node-id="{$forum->_id}"><span>{$forum->_title}</span></a>
|
|
{{endif}}
|
|
{{if $forum->hasChildren()}}
|
|
<ul class='cForumMiniList'>
|
|
{template="simplifiedViewForumSidebar_children" app="forums" location="front" group="index" params="$forum, $depth+1"}
|
|
</ul>
|
|
{{endif}}
|
|
</li>
|
|
</ul>
|
|
<div class='ipsResponsive_hideDesktop'>
|
|
<hr class='ipsHr'>
|
|
<a href='#' class='ipsButton ipsButton--wide ipsButton--primary' data-action='dialogClose'>{lang="done_forum_filtering"}</a>
|
|
</div>
|
|
</div>]]></template>
|
|
<template template_group="index" template_name="simplifiedViewForumSidebar_children" template_data="$parent" template_location="front" template_app="forums"><![CDATA[{{if $parent->hasChildren() }}
|
|
{{foreach $parent->children() as $idx => $forum}}
|
|
{{$lastPost = $forum->lastPost();}}
|
|
{{$unread = \IPS\forums\Topic::containerUnread( $forum );}}
|
|
{{$children = $forum->children();}}
|
|
{{if ! $forum->redirect_on and ( $forum->can('read') or !$forum->sub_can_post ) }}
|
|
<li class="{{if $children}}cForumMiniList__category{{endif}}" {{if $forum->feature_color}}style="--i-featured: {$forum->feature_color}; --i-featured-text: {$forum->_featureTextColor};"{{endif}}>
|
|
<a href="{$forum->url()}" data-parent-id="{$parent->_id}" data-node-id="{$forum->_id}" data-has-children="{{if $children}}1{{else}}0{{endif}}" {{if $unread}}data-ips-unread{{else}}data-ips-read{{endif}}>
|
|
<span class='cForumMiniList__blob' {{if $lastPost AND $lastPost['date']}}title="{lang="forum_simple_view_last_post"} {datetime="$lastPost['date']"}" data-ipsTooltip data-ipsTooltip-safe{{endif}}>
|
|
<i class='fa-solid fa-check'></i>
|
|
</span>
|
|
<span class='cForumMiniList__title'>{$forum->_title}</span>
|
|
<span class='cForumMiniList__count'>{number="\IPS\forums\Topic::contentCountItemsOnly( $forum )" format="short"}</span>
|
|
</a>
|
|
{{if $children}}
|
|
<ul class='cForumMiniList'>
|
|
{template="simplifiedViewForumSidebar_children" app="forums" location="front" group="index" params="$forum, 1"}
|
|
</ul>
|
|
{{endif}}
|
|
</li>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
{{endif}}]]></template>
|
|
<template template_group="index" template_name="simplifiedViewSidebar" template_data="$forumIds, $map" template_location="front" template_app="forums"><![CDATA[<div data-controller="forums.front.forum.flow" class='ipsWidget cForumMiniList_wrapper' id='elFluidFormFilters'>
|
|
<ul class='cForumMiniList {{if \count( \IPS\forums\Forum::roots() ) === 1}}cForumMiniList_singleRoot{{else}}cForumMiniList_multiRoot{{endif}}'>
|
|
{{if \count( \IPS\forums\Forum::roots() ) === 1}}
|
|
{{foreach \IPS\forums\Forum::roots() as $category}}
|
|
{template="simplifiedViewSidebar_children" app="forums" location="front" group="index" params="$forumIds, $category, 0"}
|
|
{{endforeach}}
|
|
{{else}}
|
|
{{foreach \IPS\forums\Forum::roots() as $category}}
|
|
{{if $category->hasChildren()}}
|
|
<li data-category>
|
|
<a href="{$category->url()}" data-parent-id="{$category->_id}" data-node-id="{$category->_id}" class=''><span>{$category->_title}</span></a>
|
|
{{if $category->hasChildren()}}
|
|
<ul class='cForumMiniList'>
|
|
{template="simplifiedViewSidebar_children" app="forums" location="front" group="index" params="$forumIds, $category, 0"}
|
|
</ul>
|
|
{{endif}}
|
|
</li>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
{{endif}}
|
|
{{if settings.club_nodes_in_apps and $clubForums = \IPS\forums\Forum::clubNodes()}}
|
|
<li class="{{if \in_array( 'clubs', $map )}}cForumMiniList__categorySelected{{endif}}" data-category>
|
|
<a href="{url="app=forums&module=forums&controller=index&forumId=clubs" seoTemplate="forums"}" data-parent-id="clubs" data-node-id="clubs" class='{{if \in_array( 'clubs', $map )}}cForumMiniList__selected{{endif}}'><span class=''>{lang="club_node_forums"}</span></a>
|
|
<ul class='cForumMiniList'>
|
|
{{foreach $clubForums as $idx => $forum}}
|
|
{{$lastPost = $forum->lastPost();}}
|
|
{{$unread = \IPS\forums\Topic::containerUnread( $forum );}}
|
|
{{$children = $forum->children();}}
|
|
{{if ! $forum->redirect_on and $forum->can('read') }}
|
|
<li class="{{if $children}}cForumMiniList__category{{endif}} {{if isset( $map[ $forum->parent_id ] ) AND \in_array( $forum->_id, $map[ $forum->parent_id ] )}}cForumMiniList__categorySelected{{endif}}" {{if $forum->feature_color}}style="--i-featured: {$forum->feature_color}; --i-featured-text: {$forum->_featureTextColor};"{{endif}}>
|
|
<a href="{$forum->url()}" data-parent-id="clubs" data-node-id="{$forum->_id}" data-has-children="{{if $children}}1{{else}}0{{endif}}" class='{{if \in_array( $forum->_id, $forumIds )}}cForumMiniList__selected{{endif}}' {{if $unread}}data-ips-unread{{else}}data-ips-read{{endif}}>
|
|
<span class='cForumMiniList__blob' {{if $lastPost AND $lastPost['date']}}title="{lang="forum_simple_view_last_post"} {datetime="$lastPost['date']"}" data-ipsTooltip data-ipsTooltip-safe{{endif}}>
|
|
<i class='fa-solid fa-check'></i>
|
|
</span>
|
|
<span class='cForumMiniList__title'>{lang="club_node" sprintf="$forum->club()->name, $forum->_title"}</span>
|
|
<span class='cForumMiniList__count'>{number="\IPS\forums\Topic::contentCount( $forum )" format="short"}</span>
|
|
</a>
|
|
</li>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
</ul>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
<div class='ipsResponsive_hideDesktop'>
|
|
<hr class='ipsHr'>
|
|
<a href='#' class='ipsButton ipsButton--wide ipsButton--primary' data-action='dialogClose'>{lang="done_forum_filtering"}</a>
|
|
</div>
|
|
</div>]]></template>
|
|
<template template_group="index" template_name="simplifiedViewSidebar_children" template_data="$forumIds, $parent, $depth" template_location="front" template_app="forums"><![CDATA[{{if $parent->hasChildren() and $depth < 5}}
|
|
{{foreach $parent->children() as $idx => $forum}}
|
|
{{$lastPost = $forum->lastPost();}}
|
|
{{$unread = \IPS\forums\Topic::containerUnread( $forum );}}
|
|
{{$children = $forum->children();}}
|
|
{{if ! $forum->redirect_on and ( $forum->can('read') or !$forum->sub_can_post ) }}
|
|
<li class="{{if $children}}cForumMiniList__category{{endif}}" {{if $forum->feature_color}}style="--i-featured: {$forum->feature_color}; --i-featured-text: {$forum->_featureTextColor};"{{endif}}>
|
|
<a href="{$forum->url()}" data-parent-id="{$parent->_id}" data-node-id="{$forum->_id}" data-has-children="{{if $children}}1{{else}}0{{endif}}" {{if $unread}}data-ips-unread{{else}}data-ips-read{{endif}}>
|
|
<span class='cForumMiniList__blob' {{if $lastPost AND $lastPost['date']}}title="{lang="forum_simple_view_last_post"} {datetime="$lastPost['date']"}" data-ipsTooltip data-ipsTooltip-safe{{endif}}>
|
|
<i class='fa-solid fa-check'></i>
|
|
</span>
|
|
<span class='cForumMiniList__title'>{$forum->_title}</span>
|
|
<span class='cForumMiniList__count'>{number="\IPS\forums\Topic::contentCount( $forum )" format="short"}</span>
|
|
</a>
|
|
{{if $children}}
|
|
<ul class='cForumMiniList'>
|
|
{template="simplifiedViewSidebar_children" app="forums" location="front" group="index" params="$forumIds, $forum, $depth+1"}
|
|
</ul>
|
|
{{endif}}
|
|
</li>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
{{endif}}]]></template>
|
|
<template template_group="livesearch" template_name="forum" template_data="$forum" template_location="admin" template_app="forums"><![CDATA[<li data-role='result'>
|
|
<a href='{url="app=forums&module=forums&controller=forums&do=form&id="}{$forum->id}'>{$forum->_title}</a>
|
|
</li>
|
|
|
|
]]></template>
|
|
<template template_group="settings" template_name="archiveOffCic" template_data="" template_location="admin" template_app="forums"><![CDATA[<div class='i-padding_3'>
|
|
<p class='i-font-size_2'>
|
|
{lang="archiving_blurb_off_cloud"}
|
|
</p>
|
|
</div>]]></template>
|
|
<template template_group="settings" template_name="archiveRuleGtLt" template_data="$name, $value" template_location="admin" template_app="forums"><![CDATA[<select class="ipsInput ipsInput--select" name="{$name}[0]">
|
|
<option value=">" {{if isset( $value[0] ) and $value[0] == '>'}}selected{{endif}}>{lang="greater_than"}</option>
|
|
<option value="<" {{if isset( $value[0] ) and $value[0] == '<'}}selected{{endif}}>{lang="less_than"}</option>
|
|
</select>
|
|
<input type="number" name="{$name}[1]" value="{{if isset( $value[1] )}}{$value[1]}{{endif}}" id='el{$name}_1' class="ipsInput ipsField_short"> {lang="or"}
|
|
<input type="checkbox" class="ipsInput ipsInput--toggle" name="{$name}[2]" data-control="unlimited" {{if isset( $value[2] ) and $value[2]}}checked{{endif}}>
|
|
<label for='el{$name}_1' class='ipsField_unlimited'>{{if \in_array( $name, array( 'archive_topic_post', 'archive_topic_view', 'archive_topic_rating', 'archive_not_topic_post', 'archive_not_topic_view', 'archive_not_topic_rating' ) )}}{lang="no_restriction"}{{else}}{lang="any_time"}{{endif}}</label>]]></template>
|
|
<template template_group="settings" template_name="archiveRules" template_data="$form, $totalTopics, $existingCount, $existingPercentage" template_location="admin" template_app="forums"><![CDATA[<div data-controller="forums.admin.settings.archiveRules">
|
|
<div class="i-padding_3">{lang="archiving_blurb"}</div>
|
|
<div class="i-position_sticky-top i-padding_2 i-background_1 i-text-align_center">
|
|
<strong>{lang="archive_rules_effects"}</strong>
|
|
<p class="i-color_soft"><span data-role="percentage">{$existingPercentage}</span>% (<span data-role="number">{$existingCount}</span>/{$totalTopics})</p>
|
|
<progress class="ipsProgress" value='{$existingPercentage}' max="100"></progress>
|
|
</div>
|
|
{$form|raw}
|
|
</div>]]></template>
|
|
<template template_group="settings" template_name="archiveRuleTime" template_data="$name, $value" template_location="admin" template_app="forums"><![CDATA[<select class="ipsInput ipsInput--select" name="{$name}[0]">
|
|
<option value="<" {{if isset( $value[0] ) and $value[0] == '<'}}selected{{endif}}>{lang="greater_than"}</option>
|
|
<option value=">" {{if isset( $value[0] ) and $value[0] == '>'}}selected{{endif}}>{lang="less_than"}</option>
|
|
</select>
|
|
<input type="number" name="{$name}[1]" value="{{if isset( $value[1] )}}{$value[1]}{{endif}}" class="ipsInput ipsField_short" min="0">
|
|
<select class="ipsInput ipsInput--select" name="{$name}[2]">
|
|
<option value="d" {{if isset( $value[2] ) and $value[2] == 'd'}}selected{{endif}}>{lang="days"}</option>
|
|
<option value="m" {{if isset( $value[2] ) and $value[2] == 'm'}}selected{{endif}}>{lang="months"}</option>
|
|
<option value="y" {{if isset( $value[2] ) and $value[2] == 'y'}}selected{{endif}}>{lang="years"}</option>
|
|
</select>
|
|
{lang="ago"} {lang="or"}
|
|
<input type="checkbox" class="ipsInput ipsInput--toggle" name="{$name}[3]" id='el{$name}_3' data-control="unlimited" {{if isset( $value[3] ) and $value[3]}}checked{{endif}}>
|
|
<label for='el{$name}_3' class='ipsField_unlimited'>{{if mb_strpos( $name, 'not' )}}{lang="no_restriction"}{{else}}{lang="any_time"}{{endif}}</label>]]></template>
|
|
<template template_group="stats" template_name="solvedPercentage" template_data="$value, $total, $solved, $previousValue=NULL, $previousTotal=NULL, $previousSolved=NULL, $nodes=array()" template_location="admin" template_app="forums"><![CDATA[ <div>
|
|
<span class='cStat__number cStat__number--medium' data-number='{$value}' data-ipsTooltip title="{lang="stats_solved_tooltip" sprintf="$solved, $total"}">{$value}%</span>
|
|
{{if isset( $previousValue )}}
|
|
<p class='cStat__change cStat__change--large {{if $previousValue > $value}}i-color_negative{{elseif $previousValue < $value}}i-color_positive{{else}}i-color_soft{{endif}}' data-ipsTooltip title="{lang="stats_solved_tooltip_prev" sprintf="$previousSolved, $previousTotal, $previousValue"}">
|
|
{{if $previousValue > $value}}
|
|
-{expression="$previousValue - $value"}%
|
|
{{elseif $previousValue < $value}}
|
|
{{if $previousValue}}+{expression="$value - $previousValue"}%{{else}}+ ∞{{endif}}
|
|
{{else}}
|
|
—
|
|
{{endif}}
|
|
</p>
|
|
{{endif}}
|
|
|
|
{{if \count( $nodes )}}
|
|
<hr class='ipsHr'>
|
|
<div class='i-flex'>
|
|
<div class='cStatTile__split'>
|
|
<p class='cStat__change cStat__change--small'>
|
|
{lang="overview_stats_curfilter" list="$nodes"}
|
|
</p>
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
</div>]]></template>
|
|
<template template_group="stats" template_name="statsTypeWrapper" template_data="$form, $solvedCount, $recommendedCount, $startTime, $endTime" template_location="admin" template_app="forums"><![CDATA[<div class='ipsBox' data-ips-template="statsTypeWrapper">
|
|
<h1 class='ipsBox__header'>{lang="stats_posts_by_type"}</h1>
|
|
<div>
|
|
{$form|raw}
|
|
</div>
|
|
</div>
|
|
<div class='i-margin-top_3' data-ips-template="statsTypeWrapper">
|
|
<div class="ipsTableScroll">
|
|
<table class="ipsTable ipsTable_zebra " data-role="table">
|
|
<thead>
|
|
<tr class="i-background_3">
|
|
<th>{lang="stats_posts_type_type"}</th>
|
|
<th>{lang="stats_posts_type_count"}</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr class="">
|
|
<td class="">
|
|
{lang="stats_posts_type_solved"}
|
|
</td>
|
|
<td><a href='{url="app=forums&module=stats&controller=posts&do=showSolvedPosts&startTime={$startTime}&endTime={$endTime}"}' data-ipsDialog data-ipsDialog-title='{lang="stats_posts_type_solved"}' title="{lang="stats_posts_show_posts"}" data-ipsTooltip>{$solvedCount}</a></td>
|
|
</tr>
|
|
<tr>
|
|
<td class=" ipsTable_wrap ipsTable_primary ">
|
|
{lang="stats_posts_type_recommended"}
|
|
</td>
|
|
<td><a href='{url="app=forums&module=stats&controller=posts&do=showRecommendedPosts&startTime={$startTime}&endTime={$endTime}"}' data-ipsDialog data-ipsDialog-title='{lang="stats_posts_type_recommended"}' title="{lang="stats_posts_show_posts"}" data-ipsTooltip>{$recommendedCount}</a></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
]]></template>
|
|
<template template_group="stats" template_name="timeToSolved" template_data="$value, $previousValue=NULL, $nodes=array()" template_location="admin" template_app="forums"><![CDATA[ <div>
|
|
<span class='cStat__number cStat__number--medium' data-number='{$value}'>{expression="\IPS\DateTime::roundedDiffFromSeconds( (int) $value )"}</span>
|
|
{{if isset( $previousValue )}}
|
|
<p class='cStat__change cStat__change--large {{if $previousValue < $value}}i-color_negative{{elseif $previousValue > $value}}i-color_positive{{else}}i-color_soft{{endif}}' data-ipsTooltip title="{lang="previous_period"} {expression="\IPS\DateTime::roundedDiffFromSeconds( (int) $previousValue )"}">
|
|
{{if $previousValue > $value}}
|
|
-{expression="round( 100 - ( $value / $previousValue * 100 ), 2 )"}%
|
|
{{elseif $previousValue < $value}}
|
|
{{if $previousValue}}+{expression="round( ( ( $value - $previousValue ) / $previousValue ) * 100, 2 )"}%{{else}}+ ∞{{endif}}
|
|
{{else}}
|
|
—
|
|
{{endif}}
|
|
</p>
|
|
{{endif}}
|
|
|
|
{{if \count( $nodes )}}
|
|
<hr class='ipsHr'>
|
|
<div class='i-flex'>
|
|
<div class='cStatTile__split'>
|
|
<p class='cStat__change cStat__change--small'>
|
|
{lang="overview_stats_curfilter" list="$nodes"}
|
|
</p>
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
</div>]]></template>
|
|
<template template_group="submit" template_name="createTopic" template_data="$form, $forum, $title" template_location="front" template_app="forums"><![CDATA[
|
|
{{if $club = $forum->club()}}
|
|
{{if settings.clubs and settings.clubs_header == 'full'}}
|
|
{template="header" app="core" group="clubs" params="$club, $forum"}
|
|
{{endif}}
|
|
<div id='elClubContainer'>
|
|
{{endif}}
|
|
|
|
{template="pageHeader" if="!\IPS\Request::i()->isAjax()" group="global" app="core" params="\IPS\Member::loggedIn()->language()->addToStack( $title )"}
|
|
|
|
{$form|raw}
|
|
|
|
{{if $club = $forum->club()}}
|
|
</div>
|
|
{{endif}}]]></template>
|
|
<template template_group="submit" template_name="createTopicForm" template_data="$forum, $hasModOptions, $topic, $id, $action, $elements, $hiddenValues, $actionButtons, $uploadField, $class='', $attributes=array(), $sidebar=NULL, $form=NULL, $errorTabs=array()" template_location="front" template_app="forums"><![CDATA[{{$modOptions = array( 'topic_create_state', 'create_topic_locked', 'create_topic_pinned', 'create_topic_hidden', 'create_topic_featured', 'topic_open_time', 'topic_close_time');}}
|
|
|
|
<form accept-charset='utf-8' class="ipsFormWrap" action="{$action}" method="post" {{if $uploadField}}enctype="multipart/form-data"{{endif}} data-ipsForm data-ipsFormSubmit>
|
|
<input type="hidden" name="{$id}_submitted" value="1">
|
|
{{foreach $hiddenValues as $k => $v}}
|
|
<input type="hidden" name="{$k}" value="{$v}">
|
|
{{endforeach}}
|
|
{{if $uploadField}}
|
|
<input type="hidden" name="MAX_FILE_SIZE" value="{$uploadField}">
|
|
<input type="hidden" name="plupload" value="{expression="md5( mt_rand() )"}">
|
|
{{endif}}
|
|
|
|
{{if $form->error}}
|
|
<p class="ipsMessage ipsMessage--error i-margin-bottom_block">{$form->error}</p>
|
|
{{endif}}
|
|
|
|
{{if !empty( $errorTabs )}}
|
|
<p class="ipsMessage ipsMessage--error i-margin-bottom_block ipsJS_show">{lang="tab_error"}</p>
|
|
{{endif}}
|
|
|
|
<div class='ipsBox ipsPull'>
|
|
{{if \count( $elements ) > 1}}
|
|
<div class='ipsTabs ipsJS_show' id='tabs_{$id}' data-ipsTabBar data-ipsTabBar-contentArea='#ipsTabs_content_{$id}'>
|
|
<ul role='tablist'>
|
|
{{foreach $elements as $name => $content}}
|
|
<li>
|
|
<a href='#ipsTabs_tabs_{$id}_{$id}_tab_{$name}_panel' id='{$id}_tab_{$name}' class="ipsTabs__tab {{if \in_array( $name, $errorTabs )}}ipsTabs_error{{endif}}" role="tab" aria-selected="{{if $name == 'mainTab'}}true{{else}}false{{endif}}">
|
|
{{if \in_array( $name, $errorTabs )}}<i class="fa-solid fa-circle-exclamation"></i> {{endif}}{lang="$name"}
|
|
</a>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
{template="tabScrollers" app="core" group="global" location="global"}
|
|
</div>
|
|
<div id='ipsTabs_content_{$id}' class='ipsTabs__panels'>
|
|
{{foreach $elements as $name => $contents}}
|
|
<div id='ipsTabs_tabs_{$id}_{$id}_tab_{$name}_panel' class="ipsTabs__panel ipsTabs__panel--{$name}" aria-labelledby="{$id}_tab_{$name}" aria-hidden="false">
|
|
|
|
{{if $hasModOptions && $name == 'topic_mainTab'}}
|
|
<div class='ipsColumns ipsColumns--new-topic ipsColumns--lines'>
|
|
<div class='ipsColumns__primary'>
|
|
{{endif}}
|
|
<ul class='ipsForm ipsForm--vertical {$class} ipsForm--new-topic'>
|
|
{{foreach $contents as $inputName => $input}}
|
|
{{if !\in_array( $inputName, $modOptions )}}
|
|
{$input|raw}
|
|
{{endif}}
|
|
{{endforeach}}
|
|
</ul>
|
|
{{if $hasModOptions && $name == 'topic_mainTab'}}
|
|
</div>
|
|
<div class='ipsColumns__secondary i-basis_300'>
|
|
{template="createTopicModOptions" group="submit" app="forums" params="$elements, $modOptions"}
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
{{endforeach}}
|
|
</div>
|
|
{{else}}
|
|
<div class=''>
|
|
{{if $hasModOptions}}
|
|
<div class='ipsColumns ipsColumns--new-topic ipsColumns--lines'>
|
|
<div class='ipsColumns__primary'>
|
|
{{endif}}
|
|
<ul class='ipsForm ipsForm--vertical {$class} ipsForm--new-topic'>
|
|
{{foreach $elements as $collection}}
|
|
{{foreach $collection as $inputName => $input}}
|
|
{{if !\in_array( $inputName, $modOptions )}}
|
|
{$input|raw}
|
|
{{endif}}
|
|
{{endforeach}}
|
|
{{endforeach}}
|
|
</ul>
|
|
{{if $hasModOptions}}
|
|
</div>
|
|
<div class='ipsColumns__secondary i-basis_300'>
|
|
{template="createTopicModOptions" group="submit" app="forums" params="$elements, $modOptions"}
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
{{endif}}
|
|
|
|
<div class='ipsSubmitRow'>
|
|
{{if $topic}}
|
|
<button type='submit' class='ipsButton ipsButton--primary' tabindex="1" accesskey="s" role="button">{lang="submit_topic_edit"}</button>
|
|
{{else}}
|
|
<button type='submit' class='ipsButton ipsButton--primary' tabindex="1" accesskey="s" role="button">{lang="submit_topic"}</button>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
</form>]]></template>
|
|
<template template_group="submit" template_name="createTopicModOptions" template_data="$elements, $modOptions" template_location="front" template_app="forums"><![CDATA[
|
|
<h3 class='i-padding_3 i-border-bottom_3 ipsTitle ipsTitle--h5' hidden>{lang="topic_moderator_options"}</h3>
|
|
<ul class='ipsForm ipsForm--vertical ipsForm--topic-mod-options'>
|
|
{{foreach $elements as $collection}}
|
|
{{foreach $collection as $inputName => $input}}
|
|
{{if \in_array( $inputName, $modOptions )}}
|
|
{{if $inputName == 'topic_open_time' or $inputName == 'topic_close_time'}}
|
|
<li class='ipsFieldRow'>
|
|
<label class="ipsFieldRow__label" for="elInput_{$input->name}">{lang="$input->name"}</label>
|
|
<ul class='ipsFieldRow__content cCreateTopic_date'>
|
|
<li>
|
|
<input type="date" name="{$input->name}" id="elInput_{$input->name}" class="ipsInput" data-control="date" placeholder='{expression="str_replace( array( 'YYYY', 'MM', 'DD' ), array( \IPS\Member::loggedIn()->language()->addToStack('_date_format_yyyy'), \IPS\Member::loggedIn()->language()->addToStack('_date_format_mm'), \IPS\Member::loggedIn()->language()->addToStack('_date_format_dd') ), str_replace( 'Y', 'YY', \IPS\Member::loggedIn()->language()->preferredDateFormat() ) )"}' value="{{if $input->value instanceof \IPS\DateTime}}{$input->value->format('Y-m-d')}{{else}}{$input->value}{{endif}}" data-preferredFormat="{{if $input->value instanceof \IPS\DateTime}}{$input->value->localeDate()}{{else}}{$input->value}{{endif}}">
|
|
</li>
|
|
<li>
|
|
<input name="{$input->name}_time" type="time" size="12" class="ipsInput" placeholder="{lang="_time_format_hhmm"}" step="60" min="00:00" value="{{if $input->value instanceof \IPS\DateTime}}{$input->value->format('H:i')}{{endif}}">
|
|
</li>
|
|
</ul>
|
|
</li>
|
|
{{else}}
|
|
{$input|raw}
|
|
{{endif}}
|
|
{{endif}}
|
|
{{endforeach}}
|
|
{{endforeach}}
|
|
</ul>
|
|
]]></template>
|
|
<template template_group="topics" template_name="activity" template_data="$topic, $location" template_location="front" template_app="forums"><![CDATA[{{$lastPoster = \IPS\Member::load( $topic->last_poster_id);}}
|
|
{{$members = $topic->topPosters(4);}}
|
|
{{$busy = $topic->showSummaryFeature('popularDays') ? $topic->popularDays(4) : FALSE;}}
|
|
{{$reacted = $topic->showSummaryFeature('topPost') ? $topic->topReactedPosts(3) : FALSE;}}
|
|
{{$helpful = $topic->showSummaryFeature('helpful') ? $topic->helpfulPosts(3) : FALSE;}}
|
|
{{$images = $topic->showSummaryFeature('uploads') ? $topic->imageAttachments(4) : FALSE;}}
|
|
{{$hasAnyContent = (bool) ($members or $reacted or $helpful or $images);}}
|
|
{{if $location == 'sidebar'}}
|
|
<div class="ipsWidget cTopicOverview cTopicOverview--sidebar i-flex i-flex-direction_column i-overflow_hidden ipsResponsive_showDesktop" {{if $hasAnyContent}}data-controller='forums.front.topic.activity'{{endif}}>
|
|
{{else}}
|
|
<div class="cTopicOverview cTopicOverview--row i-flex {{if $topic->showSummaryOnDesktop() != 'post'}}ipsResponsive_hideDesktop{{endif}} {{if ! $topic->showSummaryOnMobile()}}ipsResponsive_hidePhone{{endif}}" {{if $hasAnyContent}}data-controller='forums.front.topic.activity'{{endif}}>
|
|
{{endif}}
|
|
<div class='cTopicOverview__header i-background_1 i-flex_00 i-flex i-flex-wrap_wrap'>
|
|
<ul class="iTopicOverview__header i-flex_91 i-padding_3 i-flex i-flex-wrap_wrap i-justify-content_space-around i-gap_3 i-text-align_center">
|
|
<li>
|
|
<span class="i-color_soft i-font-weight_500 i-display_block">{lang="replies"}</span>
|
|
<span class="i-color_hard i-font-weight_700 i-display_block i-font-size_3">{number="$topic->posts-1" format="short"}</span>
|
|
</li>
|
|
<li>
|
|
<span class="i-color_soft i-font-weight_500 i-display_block">{lang="topicactivity_created"}</span>
|
|
<span class="i-color_hard i-font-weight_700 i-display_block i-font-size_3">{datetime="$topic->start_date" short="true"}</span>
|
|
</li>
|
|
<li>
|
|
<span class="i-color_soft i-font-weight_500 i-display_block">{lang="last_reply"}</span>
|
|
<span class="i-color_hard i-font-weight_700 i-display_block i-font-size_3">{datetime="$topic->last_post" short="true"}</span>
|
|
</li>
|
|
</ul>
|
|
{{if $location != 'sidebar'}}
|
|
<a href='#' data-action='toggleOverview' class='cTopicOverview__toggle cTopicOverview__toggle--row i-flex_10 i-basis_80 i-color_soft i-font-size_2'><span class="ipsInvisible">{lang="topicactivity_expand"}</span><i class='fa-solid fa-chevron-down'></i></a>
|
|
{{endif}}
|
|
</div>
|
|
{{if $location !== 'sidebar'}}
|
|
<div class='cTopicOverview__preview i-flex_10' data-role="preview">
|
|
<div class='cTopicOverview__previewInner i-padding_3 i-flex i-gap_3 ipsResponsive_hidePhone'>
|
|
{{if $members}}
|
|
<div class='cTopicOverview__section--users i-flex_00'>
|
|
<h4 class='cTopicOverview__sectionTitle i-font-size_-1 i-color_hard i-text-transform_uppercase i-font-weight_600'>{lang="topicactivity_topposters"}</h4>
|
|
<ul class='cTopicOverview__dataList i-flex i-justify-content_space-between i-align-items_center i-gap_3 i-margin-top_1'>
|
|
{{foreach $members as $data}}
|
|
<li class="cTopicOverview__dataItem i-flex i-justify-content_start i-align-items_center i-gap_2">
|
|
{template="userPhoto" app="core" group="global" params="$data['member'], 'tiny'"}
|
|
<span>{$data['count']}</span>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</div>
|
|
{{endif}}
|
|
{{if $busy}}
|
|
<div class='cTopicOverview__section--popularDays i-flex_00'>
|
|
<h4 class='cTopicOverview__sectionTitle i-font-size_-1 i-color_hard i-text-transform_uppercase i-font-weight_600'>{lang="topicactivity_populardays"}</h4>
|
|
<ul class='cTopicOverview__dataList i-flex i-justify-content_space-between i-align-items_center i-gap_3 i-margin-top_1'>
|
|
{{foreach $busy as $row}}
|
|
<li class='i-flex_10'>
|
|
<a href="{$topic->url()->setQueryString( array( 'do' => 'findComment', 'comment' => $row['commentId'] ) )}" rel="nofollow" class='cTopicOverview__dataItem i-flex i-justify-content_space-between i-align-items_center i-gap_2'>
|
|
<span class='i-color_soft'>{$row['date']->dayAndShortMonth()}</span>
|
|
<span class='i-font-weight_500 i-color_hard'>{$row['count']}</span>
|
|
</a>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
<div class='cTopicOverview__body i-padding_3 i-gap_3 {{if $location !== 'sidebar'}}ipsHide i-flex i-flex_11 i-flex-direction_column{{endif}}' data-role="overview">
|
|
{{if $members}}
|
|
<div class='cTopicOverview__section--users'>
|
|
<h4 class='ipsTitle ipsTitle--hr ipsTitle--h6 i-font-weight_600 i-text-transform_uppercase i-font-size_-2 i-margin-bottom_2'>{lang="topicactivity_topposters"}</h4>
|
|
<ul class='cTopicOverview__dataList ipsGrid i-basis_140 i-gap_2'>
|
|
{{foreach $members as $data}}
|
|
<li class="ipsPhotoPanel">
|
|
{template="userPhoto" app="core" group="global" params="$data['member'], 'fluid'"}
|
|
<div class='ipsPhotoPanel__text'>
|
|
<strong class='ipsPhotoPanel__primary'><a href='{$data['member']->url()}'>{$data['member']->name}</a></strong>
|
|
<span class='ipsPhotoPanel__secondary'>{lang="topicactivity_number_posts" pluralize="$data['count']"}</span>
|
|
</div>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</div>
|
|
{{endif}}
|
|
{{if $busy}}
|
|
<div class='cTopicOverview__section--popularDays'>
|
|
<h4 class='ipsTitle ipsTitle--hr ipsTitle--h6 i-font-weight_600 i-text-transform_uppercase i-font-size_-2 i-margin-top_4 i-margin-bottom_2'>{lang="topicactivity_populardays"}</h4>
|
|
<ul class='cTopicOverview__dataList ipsGrid i-basis_140 i-gap_2'>
|
|
{{foreach $busy as $row}}
|
|
<li>
|
|
<a href="{$topic->url()->setQueryString( array( 'do' => 'findComment', 'comment' => $row['commentId'] ) )}" rel="nofollow" class='cTopicOverview__dataItem i-flex i-justify-content_start i-align-items_center i-gap_2'>
|
|
<span class='i-font-weight_bold'>{$row['date']->dayAndShortMonth()} {$row['date']->format('Y')}</span>
|
|
<span class='i-color_soft'>{lang="topicactivity_number_posts" pluralize="$row['count']"}</span>
|
|
</a>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</div>
|
|
{{endif}}
|
|
{{if $reacted}}
|
|
<div class='cTopicOverview__section--topPost'>
|
|
<h4 class='ipsTitle ipsTitle--hr ipsTitle--h6 i-font-weight_600 i-text-transform_uppercase i-font-size_-2 i-margin-top_4'>{lang="topicactivity_popularposts"}</h4>
|
|
{{foreach $reacted as $data}}
|
|
<div class='i-position_relative'>
|
|
<a href="{$data['comment']->url()}" rel="nofollow" class="i-position_cover" aria-hidden='true'><span class='ipsInvisible'>{$data['comment']->author()->name}</span></a>
|
|
<div class='ipsPhotoPanel ipsPhotoPanel--tiny i-margin-top_3'>
|
|
<span class='ipsUserPhoto'>
|
|
<img src='{$data['comment']->author()->photo}' alt='{$data['comment']->author()->name}' loading='lazy'>
|
|
</span>
|
|
<div class="ipsPhotoPanel__text">
|
|
<h5 class='ipsPhotoPanel__primary'>{$data['comment']->author()->name}</h5>
|
|
<p class='ipsPhotoPanel__secondary'>{datetime="$data['comment']->mapped('date')"}</p>
|
|
</div>
|
|
</div>
|
|
<p class='i-margin-top_2 ipsRichText ipsTruncate_3'>
|
|
{$data['comment']->truncated(true, 200)}
|
|
</p>
|
|
</div>
|
|
{{endforeach}}
|
|
</div>
|
|
{{endif}}
|
|
{{if $helpful}}
|
|
<div class='cTopicOverview__section--topPost'>
|
|
<h4 class='ipsTitle ipsTitle--hr ipsTitle--h6 i-font-weight_600 i-text-transform_uppercase i-font-size_-2 i-margin-top_4'>{lang="topicactivity_helpfulposts"}</h4>
|
|
{{foreach $helpful as $data}}
|
|
<div class='i-position_relative'>
|
|
<a href="{$data['comment']->url()}" rel="nofollow" class="i-position_cover" aria-hidden='true'><span class='ipsInvisible'>{$data['comment']->author()->name}</span></a>
|
|
<div class='ipsPhotoPanel ipsPhotoPanel--tiny i-margin-top_3'>
|
|
<span class='ipsUserPhoto'>
|
|
<img src='{$data['comment']->author()->photo}' alt='{$data['comment']->author()->name}' loading='lazy'>
|
|
</span>
|
|
<div>
|
|
<h5 class='i-font-weight_bold'>{$data['comment']->author()->name}</h5>
|
|
<p class='i-color_soft'>{datetime="$data['comment']->mapped('date')"}</p>
|
|
</div>
|
|
</div>
|
|
<p class='i-margin-top_2 ipsRichText ipsTruncate_3'>
|
|
{$data['comment']->truncated(true, 200)}
|
|
</p>
|
|
</div>
|
|
{{endforeach}}
|
|
</div>
|
|
{{endif}}
|
|
{{if $images}}
|
|
<div class='cTopicOverview__section--images'>
|
|
<h4 class='ipsTitle ipsTitle--hr ipsTitle--h6 i-font-weight_600 i-text-transform_uppercase i-font-size_-2 i-margin-top_4'>{lang="topicactivity_images"}</h4>
|
|
<div class="i-margin-top_2" data-controller='core.front.core.lightboxedImages'>
|
|
<ul class='cTopicOverview__imageGrid ipsGrid i-basis_120 i-gap_1'>
|
|
{{foreach $images as $row}}
|
|
{{$image = \IPS\File::get( 'core_Attachment', ( $row['attach_thumb_location'] ) ? $row['attach_thumb_location'] : $row['attach_location'] )->url;}}
|
|
<li class='cTopicOverview__image'>
|
|
<a href="{$row['commentUrl']}" rel="nofollow" class='ipsThumb'>
|
|
<img src="{$image}" alt='' loading='lazy'>
|
|
</a>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
{{if $location !== 'sidebar' and $hasAnyContent}}
|
|
<a href='#' data-action='toggleOverview' class='cTopicOverview__toggle cTopicOverview__toggle--afterStats i-font-size_2 i-color_soft i-padding_3 i-flex i-align-items_center i-justify-content_center'><span class="ipsInvisible">{lang="topicactivity_expand"}</span><i class='fa-solid fa-chevron-down'></i></a>
|
|
{{endif}}
|
|
{{if $location == 'sidebar'}}
|
|
</div>
|
|
{{else}}
|
|
</div>
|
|
{{endif}}
|
|
|
|
]]></template>
|
|
<template template_group="topics" template_name="expertBadge" template_data="$topic, $comment, $viewerIsFollowingTheseExperts" template_location="front" template_app="forums"><![CDATA[{{$isFollowing = ( is_array( $viewerIsFollowingTheseExperts ) and count( $viewerIsFollowingTheseExperts ) and in_array( $comment->author()->member_id, $viewerIsFollowingTheseExperts ) );}}
|
|
<span class="ipsBadge ipsBadge--expert">
|
|
<i class="fa-solid fa-graduation-cap"></i>
|
|
{lang="forums_is_expert"}
|
|
{{if $comment->author()->member_id != \IPS\Member::loggedIn()->member_id }}
|
|
<span data-followApp='core' data-followArea='member' data-followID='{$comment->author()->member_id}' data-buttonSize="small" data-controller='core.front.core.followButton'>
|
|
{template="memberFollowButton" group="profile" app="core" params="'core', 'member', $comment->author()->member_id, 0, 'small', $isFollowing"}
|
|
</span>
|
|
{{endif}}
|
|
</span>
|
|
|
|
]]></template>
|
|
<template template_group="topics" template_name="post" template_data="$item, $comment, $editorName, $app, $type, $class='', $viewerIsFollowingTheseExperts=[]" template_location="front" template_app="forums"><![CDATA[{{$idField = $comment::$databaseColumnId;}}
|
|
<div id='comment-{$comment->$idField}_wrap' data-controller='core.front.core.comment' data-feedid="{$comment->feedId}" data-commentApp='{$app}' data-commentType='{$type}' data-commentID="{$comment->$idField}" data-quoteData='{expression="json_encode( array('userid' => $comment->author()->member_id, 'username' => $comment->author()->name, 'timestamp' => $comment->mapped('date'), 'contentapp' => $comment::$application, 'contenttype' => $type, 'contentid' => $item->tid, 'contentclass' => $class, 'contentcommentid' => $comment->$idField) )"}' class='ipsEntry__content js-ipsEntry__content'
|
|
{{if \IPS\IPS::classUsesTrait( $comment, 'IPS\Content\IntersectionViewTracking' ) AND $hash=$comment->getViewTrackingHash()}}
|
|
data-view-hash="{$hash|raw}"
|
|
data-view-tracking-data="{expression="base64_encode(json_encode( $comment->getViewTrackingData() ))" raw="true"}"
|
|
{{if \IPS\Platform\Bridge::i()->featureIsEnabled( 'topic_summary' ) AND \IPS\Settings::i()->ips_topic_summary_enabled}}
|
|
data-post-score={expression="json_encode( $comment->post_score )" raw="true"} {{if $comment->post_force_in_summary}}data-post-force-in-summary="1"{{endif}}
|
|
{{endif}}
|
|
{{endif}}
|
|
{{if \IPS\Member::loggedIn()->getLayoutValue( 'forum_topic_view_firstpost' ) and $comment->isFirst()}}
|
|
data-first-post="true"
|
|
data-first-page="{{if isset( request.page ) and request.page > 1}}false{{else}}true{{endif}}"
|
|
{{endif}}
|
|
>
|
|
<div class='ipsEntry__post'>
|
|
<div class='ipsEntry__meta'>
|
|
<a href='{$comment->item()->url()->setQueryString( array( 'do' => 'findComment', 'comment' => $comment->$idField ) )}' class='ipsEntry__date' rel="nofollow">{$comment->dateLine()|raw}</a>
|
|
<!-- Traditional badges -->
|
|
<ul data-ips-hook="postBadges" class='ipsBadges'>
|
|
{{if ! $comment->isFirst() and $comment->author()->member_id AND $comment->author()->member_id == $item->author()->member_id}}
|
|
<li><span class="ipsBadge ipsBadge--author">{lang="author"}</span></li>
|
|
{{endif}}
|
|
{{if $comment->authorIsAnExpert()}}
|
|
<li>{template="expertBadge" group="topics" app="forums" params="$item, $comment, $viewerIsFollowingTheseExperts"}</li>
|
|
{{endif}}
|
|
{{if $comment->author()->hasHighlightedReplies()}}
|
|
<li><span class='ipsBadge ipsBadge--highlightedGroup'>{expression="\IPS\Member\Group::load( $comment->author()->member_group_id )->name" raw="true"}</span></li>
|
|
{{endif}}
|
|
{{if ( $comment->item()->isSolved() and $comment->item()->mapped('solved_comment_id') == $comment->pid )}}
|
|
<li><span class='ipsBadge ipsBadge--solution'><i class='fa-solid fa-check' aria-hidden="true"></i><span>{lang="this_is_a_solved_post"}</span></span></li>
|
|
{{endif}}
|
|
{{if $comment->isFeatured()}}
|
|
<li><span class='ipsBadge ipsBadge--positive'>{lang="this_is_a_featured_post"}</span></li>
|
|
{{endif}}
|
|
{{if $comment->isHighlighted() }}
|
|
<li><span class='ipsBadge ipsBadge--popular'>{lang="this_is_a_popular_post"}</span></li>
|
|
{{endif}}
|
|
</ul>
|
|
{$comment->menu()->linkHtml()|raw}
|
|
{{if \count( $item->commentMultimodActions() ) and !$comment->mapped('first')}}
|
|
<input type="checkbox" name="multimod[{$comment->$idField}]" value="1" data-role="moderation" data-actions="{{if $comment->canSplit()}}split merge{{endif}} {{if $comment->hidden() === -1 AND $comment->canUnhide()}}unhide{{elseif $comment->hidden() === 1 AND $comment->canUnhide()}}approve{{elseif $comment->canHide()}}hide{{endif}} {{if $comment->canDelete()}}delete{{endif}}" data-state='{{if $comment->tableStates()}}{$comment->tableStates()}{{endif}}' class="ipsInput ipsInput--toggle" id='mod-checkbox-{$comment->$idField}'>
|
|
{{endif}}
|
|
</div>
|
|
{{if $comment->hidden() !== 0}}
|
|
<div class='ipsEntry__hiddenMessage'>
|
|
{{if $comment->hidden() AND $comment->hidden() != -2}}
|
|
{$comment->hiddenBlurb()}
|
|
{{elseif $comment->hidden() == -2}}
|
|
{$comment->deletedBlurb()}
|
|
{{endif}}
|
|
</div>
|
|
{{endif}}
|
|
|
|
{{if member.modPermission('mod_see_warn') and $comment->warning}}
|
|
{template="commentWarned" group="global" app="core" params="$comment"}
|
|
{{endif}}
|
|
|
|
{{if $comment->showRecognized()}}
|
|
{template="commentRecognized" group="global" app="core" params="$comment"}
|
|
{{endif}}
|
|
|
|
<!-- Post content -->
|
|
<div data-ips-hook="postContent" class='ipsRichText ipsRichText--user' data-role='commentContent' data-controller='core.front.core.lightboxedImages'>
|
|
|
|
{{if \IPS\Member::loggedIn()->getLayoutValue( 'forum_topic_view_firstpost' ) and $comment->isFirst() and isset( request.page ) and request.page > 1}}
|
|
<div class="ipsEntry__truncate" data-ipsTruncate>
|
|
{{endif}}
|
|
|
|
{$comment->content()|raw}
|
|
|
|
{{if \IPS\Member::loggedIn()->getLayoutValue( 'forum_topic_view_firstpost' ) and $comment->isFirst() and isset( request.page ) and request.page > 1}}
|
|
</div>
|
|
{{endif}}
|
|
|
|
{{if $comment->editLine()}}
|
|
{$comment->editLine()|raw}
|
|
{{endif}}
|
|
</div>
|
|
|
|
{{if $comment->author()->signature AND trim( $comment->author()->signature )}}
|
|
{template="signature" group="global" app="core" params="$comment->author()"}
|
|
{{endif}}
|
|
|
|
</div>
|
|
{{if ( \IPS\IPS::classUsesTrait( $comment, 'IPS\Content\Reactable' ) and settings.reputation_enabled and $comment->hasReactionBar() ) || ( $comment->hidden() === 1 && ( $comment->canUnhide() || $comment->canDelete() ) ) || ( $comment->hidden() === 0 and $item->canComment() and $editorName ) || $comment->item()->canSolve() }}
|
|
<div class='ipsEntry__footer'>
|
|
<menu data-ips-hook="postFooterControls" class='ipsEntry__controls' data-role="commentControls" data-controller="core.front.helpful.helpful">
|
|
{{if $comment->hidden() === 1 && ( $comment->canUnhide() || $comment->canDelete() )}}
|
|
{{if $comment->canUnhide()}}
|
|
<li><a href='{$comment->url('unhide')->csrf()}' data-action='approveComment'><i class='fa-solid fa-check' aria-hidden="true"></i><span>{lang="approve"}</span></a></li>
|
|
{{endif}}
|
|
{{if $comment->canDelete()}}
|
|
<li><a href='{$comment->url('delete')->csrf()->setPage('page',\IPS\Request::i()->page)}' data-action='deleteComment' data-updateOnDelete="#commentCount"><i class='fa-solid fa-xmark' aria-hidden="true"></i><span>{lang="delete"}</span></a></li>
|
|
{{endif}}
|
|
{{if $comment->canEdit() || $comment->canSplit() || $comment->canHide()}}
|
|
<li>
|
|
<a href='#elControls_{$comment->$idField}_moderator_menu' id='elControls_{$comment->$idField}_moderator' data-ipsMenu data-ipsMenu-appendTo='#comment-{$comment->$idField}_wrap'><span>{lang="moderator_tools"}</span><i class='fa-solid fa-caret-down' aria-hidden="true"></i></a>
|
|
<ul data-ips-hook="postFooterControlsMenu" id='elControls_{$comment->$idField}_moderator_menu' class='ipsMenu ipsMenu_narrow ipsHide'>
|
|
{{if $comment->canEdit()}}
|
|
{{if $comment->mapped('first') and $comment->item()->canEdit()}}
|
|
<li class='ipsMenu_item'><a href='{$comment->item()->url()->setQueryString( 'do', 'edit' )}'>{lang="edit"}</a></li>
|
|
{{else}}
|
|
<li class='ipsMenu_item'><a href='{$comment->url('edit')}' data-action='editComment'>{lang="edit"}</a></li>
|
|
{{endif}}
|
|
{{endif}}
|
|
{{if $comment->canSplit()}}
|
|
<li class='ipsMenu_item'><a href='{$comment->url('split')}' data-action='splitComment' data-ipsDialog data-ipsDialog-title="{lang="split_to_new" sprintf="\IPS\Member::loggedIn()->language()->addToStack( $item::$title )"}" data-ipsDialog-destructOnClose='true'>{lang="split"}</a></li>
|
|
{{endif}}
|
|
{{if \IPS\IPS::classUsesTrait( $comment, 'IPS\Content\Hideable' ) and $comment->canHide()}}
|
|
<li class='ipsMenu_item'><a href='{$comment->url('hide')->csrf()}' data-ipsDialog data-ipsDialog-title="{lang="hide"}" data-ipsDialog-destructOnClose='true'>{lang="hide"}</a></li>
|
|
{{endif}}
|
|
</ul>
|
|
</li>
|
|
{{endif}}
|
|
{{else}}
|
|
{{if $comment->hidden() === 0 and $item->canComment() and $editorName}}
|
|
<li data-ipsQuote-editor='{$editorName}' data-ipsQuote-target='#comment-{$comment->$idField}' class='ipsJS_show'>
|
|
<button class='ipsHide' data-action='multiQuoteComment' data-ipsTooltip data-ipsQuote-multiQuote data-mqId='mq{$comment->$idField}' aria-label='{lang="multiquote"}'><i class='fa-solid fa-plus'></i></button>
|
|
</li>
|
|
<li data-ipsQuote-editor='{$editorName}' data-ipsQuote-target='#comment-{$comment->$idField}' class='ipsJS_show'>
|
|
<a href='#' data-action='quoteComment' data-ipsQuote-singleQuote><i class="fa-solid fa-quote-left" aria-hidden="true"></i><span>{lang="quote"}</span></a>
|
|
</li>
|
|
{{endif}}
|
|
{{if ( $comment->item()->isSolved() and $comment->item()->mapped('solved_comment_id') == $comment->pid ) AND $comment->item()->canSolve()}}
|
|
<li><a href='{$item->url()->csrf()->setQueryString( array( 'do' => 'unsolve', 'answer' => $comment->pid ) )}' data-action="unsolveComment"><i class="fa-solid fa-xmark" aria-hidden="true"></i><span>{lang="unsolve_content"}</span></a></li>
|
|
{{endif}}
|
|
{{if $comment->item()->canSolve() AND ! $comment->item()->isSolved()}}
|
|
<li><a href='{$item->url()->csrf()->setQueryString( array( 'do' => 'solve', 'answer' => $comment->pid ) )}' data-action="solveComment"><i class="fa-solid fa-check" aria-hidden="true"></i><span>{lang="solve_content"}</span></a></li>
|
|
{{endif}}
|
|
{{if \IPS\Application::appIsEnabled('cloud')}}
|
|
<li>{template="spam" app="cloud" group="spam" params="$comment, FALSE"}</li>
|
|
{{endif}}
|
|
{{if ! $comment->mapped('first')}}
|
|
{template="helpfulButton" group="system" app="core" params="$comment, $item"}
|
|
{{endif}}
|
|
{{endif}}
|
|
<li class='ipsHide' data-role='commentLoading'>
|
|
<span class='ipsLoading ipsLoading--tiny'></span>
|
|
</li>
|
|
</menu>
|
|
{{if !( $comment->hidden() === 1 && ( $comment->canUnhide() || $comment->canDelete() ) ) and \IPS\IPS::classUsesTrait( $comment, 'IPS\Content\Reactable' ) and settings.reputation_enabled}}
|
|
{template="reputation" group="global" app="core" params="$comment"}
|
|
{{endif}}
|
|
</div>
|
|
{{endif}}
|
|
{template="sharemenu" group="global" app="core" params="$comment"}
|
|
</div>]]></template>
|
|
<template template_group="topics" template_name="postContainer" template_data="$item, $comment, $votes=array(), $otherClasses='', $viewerIsFollowingTheseExperts=[]" template_location="front" template_app="forums"><![CDATA[{{$idField = $comment::$databaseColumnId;}}
|
|
{{$itemClassSafe = str_replace( '\\', '_', mb_substr( $comment::$itemClass, 4 ) );}}
|
|
{{if $comment->isIgnored()}}
|
|
<div class='ipsEntry ipsEntry--ignored' id='elIgnoreComment_{$comment->$idField}' data-ignoreCommentID='elComment_{$comment->$idField}' data-ignoreUserID='{$comment->author()->member_id}'>
|
|
<i class="fa-solid fa-user-slash"></i> {lang="ignoring_content" sprintf="$comment->author()->name"} <a href='#elIgnoreComment_{$comment->$idField}_menu' data-ipsMenu data-ipsMenu-menuID='elIgnoreComment_{$comment->$idField}_menu' data-ipsMenu-appendTo='#elIgnoreComment_{$comment->$idField}' data-action="ignoreOptions" title='{lang="see_post_ignore_options"}'>{lang="options"} <i class='fa-solid fa-caret-down'></i></a>
|
|
<ul class='ipsMenu ipsHide' id='elIgnoreComment_{$comment->$idField}_menu'>
|
|
<li class='ipsMenu_item ipsJS_show' data-ipsMenuValue='showPost'><a href='#'>{lang="show_this_post"}</a></li>
|
|
<li class='ipsMenu_sep ipsJS_show'><hr></li>
|
|
<li class='ipsMenu_item' data-ipsMenuValue='stopIgnoring'><a href='{url="app=core&module=system&controller=ignore&do=remove&id={$comment->author()->member_id}" seoTemplate="ignore"}'>{lang="stop_ignoring_posts_by" sprintf="$comment->author()->name"}</a></li>
|
|
<li class='ipsMenu_item'><a href='{url="app=core&module=system&controller=ignore" seoTemplate="ignore"}'>{lang="change_ignore_preferences"}</a></li>
|
|
</ul>
|
|
</div>
|
|
{{endif}}
|
|
<div id='comment-{$comment->$idField}'></div>
|
|
<article
|
|
data-ips-hook="postWrapper"
|
|
id='elComment_{$comment->$idField}'
|
|
class="
|
|
ipsEntry js-ipsEntry {$otherClasses} ipsEntry--{{if member.getLayoutValue('forums_post') === 'modern'}}simple{{else}}post{{endif}} {$comment->ui('css')}
|
|
{{if ( settings.reputation_enabled and settings.reputation_highlight and $comment->reactionCount() >= settings.reputation_highlight ) OR $comment->isFeatured()}} ipsEntry--popular {{endif}}
|
|
{{if $comment->author()->hasHighlightedReplies()}} ipsEntry--highlighted {{endif}}
|
|
{{if $comment->isIgnored()}} ipsHide {{endif}}
|
|
{{if $comment->hidden() OR $item->hidden() === -2}} ipsModerated {{endif}}
|
|
{{if ( $item->isSolved() and $item->mapped('solved_comment_id') == $comment->pid )}} ipsEntry--solved {{endif}}
|
|
"
|
|
{{if $comment->author()->hasHighlightedReplies()}} data-membergroup="{$comment->author()->member_group_id}" {{endif}}
|
|
{$comment->ui( 'dataAttributes' )}
|
|
{{if $field = $item::$databaseColumnMap['first_comment_id'] and $item->$field == $comment->$idField}}data-ips-first-post{{endif}}
|
|
>
|
|
|
|
{{if \IPS\Member::loggedIn()->getLayoutValue('forums_post') === 'classic'}}
|
|
<!-- Author column -->
|
|
<aside data-ips-hook="topicAuthorColumn" class='ipsEntry__author-column'>
|
|
{{if $comment->author()->isOnline() AND ( !$comment->author()->isOnlineAnonymously() OR ( $comment->author()->isOnlineAnonymously() AND \IPS\Member::loggedIn()->isAdmin() ) )}}
|
|
<span class='ipsEntry__author-online' data-ipsTooltip title='{{if $comment->author()->isOnlineAnonymously()}}{lang="online_now_anon" sprintf="$comment->author()->name"}{{elseif $comment->author()->isOnline()}}{lang="online_now" sprintf="$comment->author()->name"}{{endif}}'></span>
|
|
{{endif}}
|
|
<div data-ips-hook="postUserPhoto" class='ipsAvatarStack'>
|
|
{template="userPhoto" app="core" group="global" params="$comment->author(), 'fluid', $comment->warningRef()"}
|
|
{{if $comment->author()->modShowBadge()}}
|
|
<!-- <span class="ipsAvatarStack__badge ipsAvatarStack__badge--moderator" data-ipsTooltip title='{lang="member_is_moderator" sprintf="$comment->author()->name"}'></span> -->
|
|
{{elseif $comment->author()->joinedRecently()}}
|
|
<span class="ipsAvatarStack__badge ipsAvatarStack__badge--new" data-ipsTooltip title='{lang="member_is_new_badge" sprintf="$comment->author()->name"}'></span>
|
|
{{endif}}
|
|
{{if !$comment->isAnonymous() and $comment->author()->canHaveAchievements() and \IPS\core\Achievements\Rank::show() and $rank = $comment->author()->rank()}}
|
|
{$rank->html( 'ipsAvatarStack__rank' )|raw}
|
|
{{endif}}
|
|
</div>
|
|
<h3 data-ips-hook="postUsername" class='ipsEntry__username'>
|
|
{template="userLink" group="global" app="core" params="$comment->author(), $comment->warningRef(), FALSE, $comment->isAnonymous()"}
|
|
{{if $comment->isAnonymous() and \IPS\Member::loggedIn()->modPermission('can_view_anonymous_posters')}}
|
|
<a data-ipsHover data-ipsHover-width="370" data-ipsHover-onClick href="{{if $comment->isFirst()}}{$comment->item()->url( 'reveal' )->csrf()}{{else}}{$comment->url( 'reveal' )->csrf()}{{endif}}" rel="nofollow"><span class="ipsAnonymous" data-ipsTooltip title="{lang="post_anonymously_reveal"}"></span></a>
|
|
{{endif}}
|
|
{{if $comment->author()->modShowBadge()}}
|
|
<span class="ipsEntry__author-moderator-badge ipsBadge ipsBadge--icon ipsBadge--soft" data-ipsTooltip title='{lang="member_is_moderator" sprintf="$comment->author()->name"}'>
|
|
<i class="fa-solid fa-shield-halved"></i>
|
|
</span>
|
|
{{endif}}
|
|
</h3>
|
|
{{if !$comment->isAnonymous()}}
|
|
<div data-ips-hook="postUserGroup" class='ipsEntry__group'>
|
|
{{if $comment->author()->modShowBadge()}}
|
|
<a href='{url="app=core&module=staffdirectory&controller=directory" seoTemplate="staffdirectory"}'>{expression="\IPS\Member\Group::load( $comment->author()->member_group_id )->formattedName" raw="true"}</a>
|
|
{{else}}
|
|
{expression="\IPS\Member\Group::load( $comment->author()->member_group_id )->formattedName" raw="true"}
|
|
{{endif}}
|
|
</div>
|
|
{{endif}}
|
|
{{if !$comment->isAnonymous() && \IPS\Member\Group::load( $comment->author()->member_group_id )->g_icon }}
|
|
<div data-ips-hook="postUserGroupImage" class='ipsEntry__group-image'>
|
|
{{if $comment->author()->modShowBadge()}}
|
|
<a href='{url="app=core&module=staffdirectory&controller=directory" seoTemplate="staffdirectory"}'>
|
|
<img src='{file="$comment->author()->group['g_icon']" extension="core_Theme"}' alt='' loading='lazy'>
|
|
</a>
|
|
{{else}}
|
|
<img src='{file="$comment->author()->group['g_icon']" extension="core_Theme"}' alt='' loading='lazy'>
|
|
{{endif}}
|
|
</div>
|
|
{{endif}}
|
|
{{if $comment->author()->member_id}}
|
|
<ul data-ips-hook="postUserStats" class='ipsEntry__authorStats ipsEntry__authorStats--minimal'>
|
|
<li data-i-el="posts">
|
|
{{if \IPS\Member::loggedIn()->canAccessModule( \IPS\Application\Module::get( 'core', 'members', 'front' ) ) }}
|
|
<a href='{url="app=core&module=members&controller=profile&id={$comment->author()->member_id}&do=content" seoTemplate="profile_content" seoTitle="$comment->author()->members_seo_name"}' rel="nofollow" title='{lang="post_pl"}' data-ipsTooltip>
|
|
<i class="fa-solid fa-comment"></i>
|
|
<span data-i-el="number">{number="$comment->author()->member_posts" format="short"}</span>
|
|
<span data-i-el="label">{lang="post_pl_lc"}</span>
|
|
</a>
|
|
{{else}}
|
|
<span>
|
|
<i class="fa-solid fa-comment"></i>
|
|
<span data-i-el="number">{number="$comment->author()->member_posts" format="short"}</span>
|
|
<span data-i-el="label">{lang="post_pl_lc"}</span>
|
|
</span>
|
|
{{endif}}
|
|
</li>
|
|
{{if isset( $comment->author_solved_count )}}
|
|
<li data-ips-hook="postUserSolutions" data-i-el="solutions">
|
|
{{if \IPS\Member::loggedIn()->canAccessModule( \IPS\Application\Module::get( 'core', 'members', 'front' ) ) }}
|
|
<a href='{url="app=core&module=members&controller=profile&id={$comment->author()->member_id}&do=solutions" seoTemplate="profile_solutions" seoTitle="$comment->author()->members_seo_name"}' rel="nofollow" title='{lang="solutions"}' data-ipsTooltip>
|
|
<i class="fa-solid fa-circle-check"></i>
|
|
<span data-i-el="number">{number="$comment->author_solved_count" format="short"}</span>
|
|
<span data-i-el="label">{lang="solutions"}</span>
|
|
</a>
|
|
{{else}}
|
|
<span>
|
|
<i class="fa-solid fa-circle-check"></i>
|
|
<span data-i-el="number">{number="$comment->author_solved_count" format="short"}</span>
|
|
<span data-i-el="label">{lang="solutions"}</span>
|
|
</span>
|
|
{{endif}}
|
|
</li>
|
|
{{endif}}
|
|
{{if $comment->author()->canHaveAchievements() and \IPS\core\Achievements\Badge::show() AND \IPS\core\Achievements\Badge::getStore()}}
|
|
<li data-ips-hook="postUserBadges" data-i-el="badges">
|
|
<a href="{url="app=core&module=members&controller=profile&id={$comment->author()->member_id}&do=badges" seoTemplate="profile_badges" seoTitle="$comment->author()->members_seo_name"}" data-action="badgeLog" title="{lang="badges"}">
|
|
<i class="fa-solid fa-award"></i>
|
|
<span data-i-el="number">{number="$comment->author()->badgeCount()" format="short"}</span>
|
|
<span data-i-el="label">{lang="badges"}</span>
|
|
</a>
|
|
</li>
|
|
{{endif}}
|
|
{{if settings.reputation_enabled and settings.reputation_show_profile}}
|
|
<li data-ips-hook="postUserReputation" data-i-el="reputation">
|
|
{{if member.group['gbw_view_reps']}}
|
|
<a href="{url="app=core&module=members&controller=profile&id={$comment->author()->member_id}&do=reputation" seoTemplate="profile_reputation" seoTitle="$comment->author()->members_seo_name"}" data-action="repLog" title="{lang="reputation_title"}" data-ipstooltip>
|
|
{{else}}
|
|
<span>
|
|
{{endif}}
|
|
<i class="fa-solid fa-heart"></i>
|
|
<span data-i-el="number">{number="$comment->author()->pp_reputation_points" format="short"}</span>
|
|
<span data-i-el="label">{lang="reputation_title"}</span>
|
|
{{if member.group['gbw_view_reps']}}
|
|
</a>
|
|
{{else}}
|
|
</span>
|
|
{{endif}}
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
<ul data-ips-hook="postUserCustomFields" class='ipsEntry__authorFields'>
|
|
{template="customFieldsDisplay" group="global" app="core" params="$comment->author()"}
|
|
</ul>
|
|
{{endif}}
|
|
{$comment->ui( 'authorPanel' )|raw}
|
|
</aside>
|
|
{{endif}}
|
|
{template="postHeader" group="topics" app="forums" params="$item, $comment, $idField, $viewerIsFollowingTheseExperts"}
|
|
{template="post" group="topics" app="forums" params="$item, $comment, $item::$formLangPrefix . 'comment', $item::$application, $item::$module, $itemClassSafe, $viewerIsFollowingTheseExperts"}
|
|
</article>]]></template>
|
|
<template template_group="topics" template_name="postHeader" template_data="$item, $comment, $idField, $viewerIsFollowingTheseExperts=[]" template_location="front" template_app="forums"><![CDATA[<aside data-ips-hook="topicAuthorColumn" class='ipsEntry__header'>
|
|
<div class='ipsEntry__header-align'>
|
|
|
|
<div class='ipsPhotoPanel'>
|
|
<!-- Avatar -->
|
|
<div class='ipsAvatarStack' data-ips-hook="postUserPhoto">
|
|
{template="userPhoto" app="core" group="global" params="$comment->author(), 'fluid', $comment->warningRef()"}
|
|
{{if !$comment->isAnonymous() and $comment->author()->canHaveAchievements() and \IPS\core\Achievements\Rank::show() and $rank = $comment->author()->rank()}}
|
|
{$rank->html( 'ipsAvatarStack__rank' )|raw}
|
|
{{endif}}
|
|
{{if $comment->author()->isOnline() AND ( !$comment->author()->isOnlineAnonymously() OR ( $comment->author()->isOnlineAnonymously() AND \IPS\Member::loggedIn()->isAdmin() ) )}}
|
|
<span class='ipsOnlineStatus' data-ipsTooltip title='{{if $comment->author()->isOnlineAnonymously()}}{lang="online_now_anon" sprintf="$comment->author()->name"}{{elseif $comment->author()->isOnline()}}{lang="online_now" sprintf="$comment->author()->name"}{{endif}}'></span>
|
|
{{endif}}
|
|
</div>
|
|
<!-- Username -->
|
|
<div class='ipsPhotoPanel__text'>
|
|
<h3 data-ips-hook="postUsername" class='ipsEntry__username'>
|
|
{template="userLink" group="global" app="core" params="$comment->author(), $comment->warningRef(), FALSE, $comment->isAnonymous()"}
|
|
{{if !$comment->isAnonymous()}}
|
|
<span class='ipsEntry__group'>{expression="\IPS\Member\Group::load( $comment->author()->member_group_id )->formattedName" raw="true"}</span>
|
|
{{endif}}
|
|
{{if $comment->isAnonymous() and \IPS\Member::loggedIn()->modPermission('can_view_anonymous_posters')}}
|
|
<a data-ipsHover data-ipsHover-width="370" data-ipsHover-onClick href="{{if $comment->isFirst()}}{$comment->item()->url( 'reveal' )->csrf()}{{else}}{$comment->url( 'reveal' )->csrf()}{{endif}}" rel="nofollow"><span class="ipsAnonymousIcon" data-ipsTooltip title="{lang="post_anonymously_reveal"}"></span></a>
|
|
{{endif}}
|
|
</h3>
|
|
<p class='ipsPhotoPanel__secondary'>
|
|
<a href='{$comment->item()->url()->setQueryString( array( 'do' => 'findComment', 'comment' => $comment->$idField ) )}' rel="nofollow">{$comment->dateLine()|raw}</a>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Minimal badges -->
|
|
<ul data-ips-hook="postBadgesSecondary" class='ipsBadges'>
|
|
{{if $comment->authorIsAnExpert()}}
|
|
<li>{template="expertBadge" group="topics" app="forums" params="$item, $comment, $viewerIsFollowingTheseExperts"}</li>
|
|
{{endif}}
|
|
{{if $comment->author()->hasHighlightedReplies()}}
|
|
<li><span class='ipsBadge ipsBadge--highlightedGroup'>{expression="\IPS\Member\Group::load( $comment->author()->member_group_id )->name" raw="true"}</span></li>
|
|
{{endif}}
|
|
{{if ( $comment->item()->isSolved() and $comment->item()->mapped('solved_comment_id') == $comment->pid )}}
|
|
<li><span class='ipsBadge ipsBadge--positive'><i class='fa-solid fa-check' aria-hidden="true"></i><span>{lang="this_is_a_solved_post"}</span></span></li>
|
|
{{endif}}
|
|
{{if $comment->isFeatured()}}
|
|
<li><span class='ipsBadge ipsBadge--positive'>{lang="this_is_a_featured_post"}</span></li>
|
|
{{endif}}
|
|
{{if $comment->isHighlighted() }}
|
|
<li><span class='ipsBadge ipsBadge--popular'>{lang="this_is_a_popular_post"}</span></li>
|
|
{{endif}}
|
|
</ul>
|
|
|
|
{{if \count( $item->commentMultimodActions() ) and !$comment->mapped('first')}}
|
|
<label class='ipsInput ipsInput--toggle ipsInput--pseudo' for='mod-checkbox-{$comment->$idField}'></label>
|
|
{{endif}}
|
|
|
|
{$comment->menu()|raw}
|
|
|
|
{{if $comment->author()->member_id}}
|
|
<!-- Expand mini profile -->
|
|
<button class='ipsEntry__topButton ipsEntry__topButton--profile' type='button' aria-controls='mini-profile-{$comment->$idField}' aria-expanded='false' data-ipscontrols aria-label="Author stats" data-ipstooltip><i class="fa-solid fa-chevron-down" aria-hidden="true"></i></button>
|
|
{{endif}}
|
|
|
|
{template="miniProfile" app="core" group="global" params="$comment, $comment->$idField"}
|
|
</div>
|
|
</aside>]]></template>
|
|
<template template_group="topics" template_name="topic" template_data="$topic, $comments, $votes=array(), $nextUnread=NULL, $pagination=NULL, $topicVotes=array(), $firstPost=null, $viewerIsFollowingTheseExperts=array()" template_location="front" template_app="forums"><![CDATA[{{$Traditional = \IPS\Member::loggedIn()->getLayoutValue( 'forums_post' ) !== 'modern';}}
|
|
{{$featureFirstPost = \IPS\Member::loggedIn()->getLayoutValue( 'forum_topic_view_firstpost' );}}
|
|
{{if $club = $topic->container()->club()}}
|
|
{{if settings.clubs and settings.clubs_header == 'full'}}
|
|
{template="header" app="core" group="clubs" params="$club, $topic->container()"}
|
|
{{endif}}
|
|
<div id='elClubContainer' class='i-display_contents'>
|
|
{{endif}}
|
|
|
|
<!-- Start #ipsTopicView -->
|
|
<div class='ipsBlockSpacer' id="ipsTopicView" data-ips-topic-ui="{{if \IPS\Member::loggedIn()->getLayoutValue( 'forums_post' ) === 'modern'}}minimal{{else}}traditional{{endif}}" data-ips-topic-first-page="{{if $topic->isFirstPage()}}true{{else}}false{{endif}}" data-ips-topic-comments="{{if request.show == 'helpful'}}helpful{{else}}all{{endif}}">
|
|
|
|
{template="assignmentHeader" app="core" group="global" params="$topic"}
|
|
|
|
<div class="ipsBox ipsPull">
|
|
<header class="ipsPageHeader">
|
|
<div class="ipsPageHeader__row">
|
|
<div data-ips-hook="header" class='ipsPageHeader__primary'>
|
|
<div class='ipsPageHeader__title'>
|
|
{{if $topic->canEdit()}}
|
|
<h1 data-ips-hook="titleEditable" data-controller="core.front.core.moderation">
|
|
<span data-role="editableTitle" title='{lang="click_hold_edit"}'>{$topic->title}</span>
|
|
</h1>
|
|
{{else}}
|
|
<h1 data-ips-hook="title">{$topic->title}</h1>
|
|
{{endif}}
|
|
<div data-ips-hook="badges" class='ipsBadges'>
|
|
{{foreach $topic->badges() as $badge}}{$badge|raw}{{endforeach}}
|
|
</div>
|
|
</div>
|
|
{{if \count( $topic->tags() ) OR ( $topic->canEdit() AND $topic::canTag( NULL, $topic->container() ) )}}
|
|
{template="tagsWithPrefix" group="global" app="core" params="$topic->tags(), $topic->prefix(), FALSE, FALSE, ( $topic->canEdit() AND ( \count( $topic->tags() ) OR $topic::canTag( NULL, $topic->container() ) ) ) ? $topic->url() : NULL"}
|
|
{{endif}}
|
|
{{if $featureFirstPost and \IPS\Platform\Bridge::i()->featureIsEnabled( 'realtime' )}}
|
|
<!-- Who's viewing, for featured post header -->
|
|
<div data-controller='cloud.front.realtime.whosViewing' data-location='{expression="\IPS\cloud\Realtime::i()->getLocationHash()"}'></div>
|
|
{{endif}}
|
|
</div>
|
|
{{if !$topic->isArchived() and !$topic->container()->password}}
|
|
<ul data-ips-hook="topicHeaderButtons" class='ipsButtons'>
|
|
{{if !$topic->container()->disable_sharelinks}}
|
|
<li>{template="shareButton" app="core" group="sharelinks" params="$topic"}</li>
|
|
{{endif}}
|
|
{{if \IPS\Application::appIsEnabled('cloud')}}
|
|
<li>{template="spam" app="cloud" group="spam" params="$topic"}</li>
|
|
{{endif}}
|
|
<li>{template="follow" app="core" group="global" params="'forums', 'topic', $topic->tid, $topic->followersCount()"}</li>
|
|
</ul>
|
|
{{endif}}
|
|
</div>
|
|
{$topic->postSummaryBlurb|raw}
|
|
{{if ! $featureFirstPost}}
|
|
<!-- PageHeader footer is only shown in traditional view -->
|
|
<div class="ipsPageHeader__row ipsPageHeader__row--footer">
|
|
<div class='ipsPageHeader__primary'>
|
|
<div class='ipsPhotoPanel ipsPhotoPanel--inline'>
|
|
{template="userPhoto" group="global" app="core" params="$topic->author(), 'fluid', $topic->warningRef()"}
|
|
<div data-ips-hook="topicHeaderMetaData" class='ipsPhotoPanel__text'>
|
|
<div class="ipsPhotoPanel__primary">{lang="byline_nodate" htmlsprintf="$topic->author()->link( $topic->warningRef(), NULL, $topic->isAnonymous() )"}</div>
|
|
<div class="ipsPhotoPanel__secondary">{datetime="$topic->start_date"} {lang="in"} <a href="{$topic->container()->url()}" class="i-font-weight_600">{$topic->container()->_formattedTitle|raw}</a></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{{if \IPS\Platform\Bridge::i()->featureIsEnabled( 'realtime' )}}
|
|
<div data-controller='cloud.front.realtime.whosViewing' data-location='{expression="\IPS\cloud\Realtime::i()->getLocationHash()"}'></div>
|
|
{{endif}}
|
|
</div>
|
|
{{endif}}
|
|
</header>
|
|
|
|
{{if $featureFirstPost and $firstPost}}
|
|
|
|
<!-- First post of modern view -->
|
|
{template="postContainer" group="topics" app="forums" params="$topic, $firstPost, $votes, 'ipsEntry--first-simple', $viewerIsFollowingTheseExperts"}
|
|
|
|
{{endif}}
|
|
|
|
</div>
|
|
|
|
{{if $featureFirstPost and $firstPost and ($topic->showSummaryOnDesktop() === 'post' OR $topic->showSummaryOnMobile())}}
|
|
{template="activity" group="topics" app="forums" params="$topic, 'post'"}
|
|
{{endif}}
|
|
|
|
{{if $topic->canSolve() AND ! $topic->isSolved() AND $topic->isNotModeratorButCanSolve()}}
|
|
<!-- Has this been solved? message -->
|
|
<div class='ipsMessage ipsMessage--general ipsPull' data-controller='forums.front.topic.solved'>
|
|
<i class="fa-regular fa-circle-question ipsMessage__icon"></i>
|
|
<div class='i-flex i-justify-content_space-between i-align-items_center i-flex-wrap_wrap i-gap_1'>
|
|
<div class='i-flex_11 i-basis_420'>
|
|
<h4 class='ipsMessage__title'>{lang="solved_did_it_tho_title" sprintf="\IPS\Member::loggedIn()->name"}</h4>
|
|
<div class='ipsRichText'>{lang="solved_did_it_tho_desc"}</div>
|
|
</div>
|
|
{{if member.members_bitoptions['no_solved_reenage']}}
|
|
<a href="#" data-action="mailSolvedReminders" class="ipsButton ipsButton--primary"><i class="fa-solid fa-envelope"></i><span>{lang="solved_reengage_on"}</span></a>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
|
|
<!-- These can be hidden on traditional first page using <div data-ips-hide="traditional-first"> -->
|
|
{{if $featureFirstPost}}
|
|
{{if $topic->isSolved()}}
|
|
{template="topicSolutionMessage" group="topics" app="forums" params="$topic"}
|
|
{{elseif ( $mostHelpful = $topic->helpfulPosts(1) and $mostHelpful[0]['count'] >= \IPS\Settings::i()->forums_helpful_highlight)}}
|
|
{template="topicHelpfulMessage" group="topics" app="forums" params="$mostHelpful"}
|
|
{{endif}}
|
|
{{endif}}
|
|
|
|
<!-- Content messages -->
|
|
{template="contentItemMessages" group="global" app="core" params="$topic->getMessages(), $topic"}
|
|
|
|
{{if $topic->hidden() === 1 and $topic->canUnhide()}}
|
|
<!-- Pending approval -->
|
|
<div class="ipsMessage ipsMessage--warning ipsPull">
|
|
<div class='i-flex i-justify-content_space-between i-align-items_center i-flex-wrap_wrap i-gap_1'>
|
|
<div class='i-flex_11 i-basis_420'>
|
|
<h4 class='ipsMessage__title'>{lang="pending_approval"}</h4>
|
|
</div>
|
|
<ul class='ipsButtons'>
|
|
<li><a href="{$topic->url()->csrf()->setQueryString( array( 'do' => 'moderate', 'action' => 'unhide' ) )}" class="ipsButton ipsButton--primary" title='{lang="approve_title_topic"}'><i class="fa-solid fa-check"></i><span>{lang="approve"}</span></a></li>
|
|
{{if $topic->canDelete()}}
|
|
<li><a href='{$topic->url()->csrf()->setQueryString( array( 'do' => 'moderate', 'action' => 'delete' ) )}' data-confirm title='{lang="topic_delete_title"}' class='ipsButton ipsButton--inherit'><i class='fa-solid fa-xmark'></i><span>{lang="delete"}</span></a></li>
|
|
{{endif}}
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
{{endif}}
|
|
|
|
{{if $topic->hidden() === -1}}
|
|
<!-- Hidden topic -->
|
|
<div class="ipsMessage ipsMessage--warning ipsPull">
|
|
{$topic->hiddenBlurb()}
|
|
</div>
|
|
{{endif}}
|
|
|
|
|
|
|
|
<div class='i-flex i-flex-wrap_wrap-reverse i-align-items_center i-gap_3'>
|
|
|
|
<!-- All replies / Helpful Replies: This isn't shown on the first page, due to data-ips-hide="traditional-first" -->
|
|
{{if $featureFirstPost and $topic::itemHasHelpful( $topic ) and ( $mostHelpful = $topic->helpfulPosts(1) and $mostHelpful[0]['count'] >= \IPS\Settings::i()->forums_helpful_highlight)}}
|
|
<ul class='ipsButtons ipsButtons--start' data-ips-hide="traditional-first">
|
|
<li>
|
|
<a href='{$topic->url()->setQueryString( 'show', 'all' )}' class="ipsButton ipsButton--small {{if request.show !== 'helpful'}}ipsButton--secondary{{endif}}" rel='nofollow'>
|
|
{{if request.show === 'helpful' and $topic->posts > 2}}{lang="helpful_all_n_replies" pluralize="$topic->posts - 1, $topic->posts - 1"}{{else}}{lang="helpful_all_replies"}{{endif}}
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href='{$topic->url()->setQueryString( 'show', 'helpful' )}' class="ipsButton ipsButton--small {{if request.show == 'helpful'}}ipsButton--secondary{{endif}}" rel='nofollow' {{if request.show !== 'helpful' and $topic->helpfulsRepliesCount() > 1}}data-role="helpfulCount"{{endif}}>
|
|
{{if request.show !== 'helpful' and $topic->helpfulsRepliesCount() > 1}}{lang="helpful_only_n_helpful" pluralize="$topic->helpfulsRepliesCount()"}{{else}}{lang="helpful_only_helpful"}{{endif}}
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
{{endif}}
|
|
|
|
<!-- Start new topic, Reply to topic: Shown on all views -->
|
|
<ul data-ips-hook="topicMainButtons" class="i-flex_11 ipsButtons ipsButtons--main">
|
|
<li>
|
|
{$topic->menu()|raw}
|
|
</li>
|
|
{{if $topic->container()->can('add')}}
|
|
<li>
|
|
<a href="{$topic->container()->url()->setQueryString( 'do', 'add' )}" rel="nofollow" class='ipsButton ipsButton--text' title='{lang="start_new_topic_desc"}'><i class="fa-regular fa-pen-to-square"></i><span>{lang="start_new_topic"}</span></a>
|
|
</li>
|
|
{{endif}}
|
|
{{if $topic->canComment()}}
|
|
<li data-controller='forums.front.topic.reply'>
|
|
<a href='#replyForm' rel="nofollow" class='ipsButton {{if $topic->locked()}}ipsButton--negative{{else}}ipsButton--primary{{endif}}' data-action='replyToTopic'><i class="fa-solid fa-reply"></i><span>{lang="reply_to_this_topic"}{{if $topic->locked()}} ({lang="locked"}){{endif}}</span></a>
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
</div>
|
|
|
|
{{if $poll = $topic->getPoll()}}
|
|
<div data-ips-hook="topicPoll" class='ipsBox ipsPull'>
|
|
{$poll|raw}
|
|
</div>
|
|
{{endif}}
|
|
|
|
{template="featuredComments" group="global" app="core" params="$topic->featuredComments(), $topic->url()->setQueryString( 'recommended', 'comments' ), 'recommended_posts', 'post_lc'"}
|
|
|
|
<div id='comments' data-controller='core.front.core.commentFeed,forums.front.topic.view, core.front.core.ignoredComments' {{if settings.auto_polling_enabled}}data-autoPoll{{endif}} data-baseURL='{$topic->url()}' {{if $topic->isLastPage()}}data-lastPage{{endif}} data-feedID='{$topic->feedId}' class='cTopic ipsBlockSpacer'>
|
|
|
|
<div data-ips-hook="topicPostFeed" id="elPostFeed" class="ipsEntries ipsPull ipsEntries--topic" data-role='commentFeed' data-controller='core.front.core.moderation' {{if $topic->topic_answered_pid}} data-topicAnswerID="{$topic->topic_answered_pid}"{{endif}}>
|
|
|
|
{{if ( \count( $topic->commentMultimodActions() ) && ( $topic->posts > 1 OR $topic->mapped('unapproved_comments') > 0 OR $topic->mapped('hidden_comments') > 0 ) ) || $pagination}}
|
|
<div class="ipsButtonBar ipsButtonBar--top">
|
|
{{if $pagination}}
|
|
<div class="ipsButtonBar__pagination">{$pagination|raw}</div>
|
|
{{endif}}
|
|
{{if \count( $topic->commentMultimodActions() )}}
|
|
<div class="ipsButtonBar__end">
|
|
<ul class="ipsDataFilters">
|
|
<li>
|
|
<a class="ipsJS_show ipsDataFilters__button" href="#elCheck_menu" id="elCheck" title='{lang="select_rows_tooltip"}' data-ipsTooltip data-ipsAutoCheck data-ipsAutoCheck-context="#elPostFeed" data-ipsMenu data-ipsMenu-activeClass="ipsDataFilters__button--active">
|
|
<span class="cAutoCheckIcon"><i class="fa-regular fa-square"></i></span> <i class="fa-solid fa-caret-down"></i>
|
|
<span class='ipsNotification' data-role='autoCheckCount'>0</span>
|
|
</a>
|
|
<ul class="ipsMenu ipsMenu_auto ipsMenu_withStem ipsHide" id="elCheck_menu">
|
|
<li class="ipsMenu_title">{lang="select_rows"}</li>
|
|
<li class="ipsMenu_item" data-ipsMenuValue="all"><a href="#">{lang="all"}</a></li>
|
|
<li class="ipsMenu_item" data-ipsMenuValue="none"><a href="#">{lang="none"}</a></li>
|
|
<li class="ipsMenu_sep"><hr></li>
|
|
<li class="ipsMenu_item" data-ipsMenuValue="hidden"><a href="#">{lang="hidden"}</a></li>
|
|
<li class="ipsMenu_item" data-ipsMenuValue="unhidden"><a href="#">{lang="unhidden"}</a></li>
|
|
<li class="ipsMenu_item" data-ipsMenuValue="unapproved"><a href="#">{lang="unapproved"}</a></li>
|
|
</ul>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
{{endif}}
|
|
<form action="{$topic->url()->csrf()->setQueryString( 'do', 'multimodComment' )->setPage('page', (int) \IPS\Request::i()->page )}" method="post" data-ipsPageAction data-role='moderationTools'>
|
|
{{$postCount=0; $adShown=0; $timeLastRead = $topic->timeLastRead(); $lined = FALSE;}}
|
|
{{if \count( $comments )}}
|
|
{{foreach $topic->generateCommentMetaData( $comments, \IPS\Settings::i()->forums_mod_actions_anon ) as $comment}}
|
|
|
|
{{if (!$lined and $timeLastRead and $timeLastRead->getTimestamp() < $comment->mapped('date'))}}
|
|
{{if $lined = TRUE and $postCount}}
|
|
<div class='ipsUnreadBar'>
|
|
<span>{lang="topic_meta_unread"}</span>
|
|
</div>
|
|
{{endif}}
|
|
{{endif}}
|
|
|
|
{{$postCount++;}}
|
|
{template="postContainer" group="topics" app="forums" params="$topic, $comment, $votes, '', $viewerIsFollowingTheseExperts""}
|
|
|
|
{{$hasSolvedMessage = false;}}
|
|
{{$contentUnderPostOne = false;}}
|
|
{{if ( ! $featureFirstPost ) and $postCount == 1 and $topic->isFirstPage()}}
|
|
<!-- If this is the first post in the traditional UI, show some of the extras/messages below it -->
|
|
{{if $topic->isSolved()}}
|
|
{{$hasSolvedMessage = true;}}
|
|
<!-- Show the Solved message in favour of the Most Helpful message, if the topic is solved.. -->
|
|
{template="topicSolutionMessage" group="topics" app="forums" params="$topic"}
|
|
{{elseif ($mostHelpful = $topic->helpfulPosts(1) and $mostHelpful[0]['count'] >= \IPS\Settings::i()->forums_helpful_highlight)}}
|
|
{{$hasSolvedMessage = true;}}
|
|
<!-- Otherwise show the most helpful message if the criteria is met -->
|
|
{template="topicHelpfulMessage" group="topics" app="forums" params="$mostHelpful"}
|
|
{{endif}}
|
|
|
|
<!-- Show the All Replies / Most Helpful tabs -->
|
|
{{if $topic::itemHasHelpful( $topic ) and ($mostHelpful = $topic->helpfulPosts(1) and $mostHelpful[0]['count'] >= \IPS\Settings::i()->forums_helpful_highlight)}}
|
|
{{$contentUnderPostOne = true;}}
|
|
<ul class='ipsButtons ipsButtons--start i-padding_2'>
|
|
<li>
|
|
<a href='{$topic->url()->setQueryString( 'show', 'all' )}' class="ipsButton ipsButton--tiny {{if request.show !== 'helpful'}}ipsButton--positive{{endif}}" rel='nofollow'>
|
|
{{if request.show === 'helpful'}}{lang="helpful_all_n_replies" pluralize="$topic->posts - 1, $topic->posts - 1"}{{else}}{lang="helpful_all_replies"}{{endif}}
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a href='{$topic->url()->setQueryString( 'show', 'helpful' )}' class="ipsButton ipsButton--tiny {{if request.show == 'helpful'}}ipsButton--positive{{endif}}" rel='nofollow'>
|
|
{{if request.show !== 'helpful' and $topic->helpfulsRepliesCount() > 1}}{lang="helpful_only_n_helpful" pluralize="$topic->helpfulsRepliesCount()"}{{else}}{lang="helpful_only_helpful"}{{endif}}
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
{{endif}}
|
|
{{endif}}
|
|
|
|
{{if ( isset( $comment->metaData['comment']['moderation'] ) OR isset( $comment->metaData['comment']['timeGap'] ) )}}
|
|
{{$contentUnderPostOne = true;}}
|
|
<ul class='ipsTopicMeta'>
|
|
{{if isset( $comment->metaData['comment']['moderation'] )}}
|
|
{{foreach $comment->metaData['comment']['moderation'] as $modAction}}
|
|
<li class="ipsTopicMeta__item ipsTopicMeta__item--moderation">
|
|
<span class='ipsTopicMeta__time i-color_soft'>{datetime="$modAction['row']['ctime']" short="true"}</span>
|
|
<span class='ipsTopicMeta__action'>{$modAction['blurb']}</span>
|
|
</li>
|
|
{{endforeach}}
|
|
{{endif}}
|
|
{{if isset( $comment->metaData['comment']['timeGap'] )}}
|
|
<li class="ipsTopicMeta__item ipsTopicMeta__item--time">
|
|
{$comment->metaData['comment']['timeGap']['blurb']}...
|
|
</li>
|
|
{{endif}}
|
|
</ul>
|
|
{{endif}}
|
|
|
|
{{if $advertisement = \IPS\core\Advertisement::loadByLocation( 'ad_topic_view', $postCount, $adShown )}}
|
|
{{$adShown++;}}
|
|
{$advertisement|raw}
|
|
{{endif}}
|
|
{{if ( !$featureFirstPost and $postCount == 1 and ( $topic->showSummaryOnDesktop() === 'post' OR $topic->showSummaryOnMobile() ) )}}
|
|
{template="activity" group="topics" app="forums" params="$topic, 'post'"}
|
|
{{endif}}
|
|
{{if $topic->isFirstPage() and $postCount == 1 and $hasSolvedMessage and ! $contentUnderPostOne}}
|
|
<!-- If no content, we need some margin -->
|
|
<div class="i-margin_2"></div>
|
|
{{endif}}
|
|
{{endforeach}}
|
|
{{else}}
|
|
<div class='ipsEmptyMessage'>{lang="no_posts_show"}{{if $topic->posts > 1}} - <a href='{$topic->url()->setQueryString( 'show', 'all' )}'>{lang="topic_show_all_replies"}</a>{{endif}}</div>
|
|
{{endif}}
|
|
{template="commentMultimod" app="core" group="global" params="$topic"}
|
|
</form>
|
|
{{if $pagination}}
|
|
<div class="ipsButtonBar ipsButtonBar--bottom">
|
|
<div class="ipsButtonBar__pagination">{$pagination|raw}</div>
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
|
|
{{if $topic->isArchived()}}
|
|
<div class='ipsMessage ipsMessage--info'>
|
|
<h4 class='ipsMessage__title'>{lang="topic_is_archived"}</h4>
|
|
<p>{lang="topic_archived_desc"}</p>
|
|
</div>
|
|
{{endif}}
|
|
|
|
{{if ( $topic->commentForm() || $topic->locked() || \IPS\Member::loggedIn()->restrict_post || \IPS\Member::loggedIn()->members_bitoptions['unacknowledged_warnings'] || !\IPS\Member::loggedIn()->checkPostsPerDay()) && !$topic->isArchived()}}
|
|
<div id='replyForm' data-ips-hook="topicReplyForm" data-role='replyArea' class='cTopicPostArea ipsBox ipsPull {{if !$topic->canComment()}}cTopicPostArea_noSize{{endif}}' {{if \IPS\Application::appIsEnabled('cloud') AND \IPS\cloud\Application::featureIsEnabled( 'realtime' )}}data-controller='cloud.front.realtime.forumsReplyArea,cloud.front.realtime.whosTyping'{{endif}}>
|
|
{{if $topic->commentForm()}}
|
|
{{if $topic->locked()}}
|
|
<p class='ipsComposeArea_warning'><i class='fa-solid fa-circle-info'></i> {lang="topic_locked_can_comment"}</p>
|
|
{{elseif ( $topic->getPoll() and $topic->getPoll()->poll_only )}}
|
|
<p class='ipsComposeArea_warning'><i class='fa-solid fa-circle-info'></i> {lang="topic_poll_can_comment"}</p>
|
|
{{endif}}
|
|
{$topic->commentForm()|raw}
|
|
{{else}}
|
|
{{if $topic->locked()}}
|
|
{template="commentUnavailable" group="forms" location="front" app="core" params="'topic_locked_cannot_comment'"}
|
|
{{elseif \IPS\Member::loggedIn()->restrict_post}}
|
|
{template="commentUnavailable" group="forms" location="front" app="core" params="'restricted_cannot_comment', \IPS\Member::loggedIn()->warnings(5,NULL,'rpa'), \IPS\Member::loggedIn()->restrict_post"}
|
|
{{elseif \IPS\Member::loggedIn()->members_bitoptions['unacknowledged_warnings']}}
|
|
{template="commentUnavailable" group="forms" location="front" app="core" params="'unacknowledged_warning_cannot_post', \IPS\Member::loggedIn()->warnings( 1, FALSE )"}
|
|
{{elseif !\IPS\Member::loggedIn()->checkPostsPerDay()}}
|
|
{template="commentUnavailable" group="forms" location="front" app="core" params="'member_exceeded_posts_per_day'"}
|
|
{{endif}}
|
|
{{endif}}
|
|
</div>
|
|
{{endif}}
|
|
|
|
{{if !$topic->isArchived() and !$topic->container()->password}}
|
|
<div class='ipsPageActions ipsBox i-padding_2 ipsPull ipsResponsive_showPhone'>
|
|
{{if !$topic->container()->disable_sharelinks}}
|
|
{template="shareButton" app="core" group="sharelinks" params="$topic, 'verySmall', 'light'"}
|
|
{{endif}}
|
|
{{if \IPS\Application::appIsEnabled('cloud')}}
|
|
{template="spam" app="cloud" group="spam" params="$topic"}
|
|
{{endif}}
|
|
{template="follow" app="core" group="global" params="'forums', 'topic', $topic->tid, $topic->followersCount()"}
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
|
|
<div class='ipsPager'>
|
|
<div class="ipsPager_prev">
|
|
{{if \IPS\forums\Forum::isSimpleView( $topic->container() )}}
|
|
<a href="{url="app=forums&module=forums&controller=index" seoTemplate="forums"}" title="{lang="go_back_to_forum"}" rel="parent">
|
|
<span class="ipsPager_type">{lang="go_back_to_forum"}</span>
|
|
</a>
|
|
{{else}}
|
|
<a href="{$topic->container()->url()}" title="{lang="go_to_forum" sprintf="$topic->container()->metaTitle()"}" rel="parent">
|
|
<span class="ipsPager_type">{lang="go_back_to_forum"}</span>
|
|
</a>
|
|
{{endif}}
|
|
</div>
|
|
{{if $nextUnread !== NULL}}
|
|
<div class='ipsPager_next'>
|
|
<a href="{$topic->url()->setQueryString( array( 'do' => 'nextUnread' ) )}" title='{lang="view_next_unread_title"}'>
|
|
<span class="ipsPager_type">{lang="view_next_unread"}</span>
|
|
</a>
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
|
|
|
|
|
|
</div> <!-- End #ipsTopicView -->
|
|
|
|
|
|
{{if $topic->container()->club()}}
|
|
</div>
|
|
{{endif}}
|
|
]]></template>
|
|
<template template_group="topics" template_name="topicHelpfulMessage" template_data="$mostHelpful" template_location="front" template_app="forums"><![CDATA[{{if ( $mostHelpful[0]['comment']->hidden() == 0 OR ( \in_array( $mostHelpful[0]['comment']->hidden(), array( 1, -1 ) ) AND $mostHelpful[0]['comment']->canUnhide() ) )}}
|
|
<div data-role="mostHelpful">
|
|
<div class='ipsBox ipsBox--padding'>
|
|
<div class='ipsColumns i-align-items_center i-gap_3'>
|
|
<div class='ipsColumns__primary'>
|
|
<h4 class='ipsTitle ipsTitle--h5 ipsTitle--margin'>{lang="most_helpful_byline" htmlsprintf="$mostHelpful[0]['comment']->author()->name"}<span class='i-color_soft'>, {datetime="$mostHelpful[0]['comment']->mapped('date')"}</span></h4>
|
|
<div>
|
|
{$mostHelpful[0]['comment']->truncated()|raw}
|
|
</div>
|
|
</div>
|
|
<div class="ipsColumns__secondary">
|
|
<a href="{$mostHelpful[0]['comment']->url()}" rel="nofollow" class='ipsButton ipsButton--secondary ipsButton--small'><span>{lang="helpful_go_to_most_helpful"}</span><i class="fa-solid fa-arrow-right"></i></a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{{endif}}]]></template>
|
|
<template template_group="topics" template_name="topicSolutionMessage" template_data="$topic" template_location="front" template_app="forums"><![CDATA[{{if $solvedComment = $topic->getSolution() AND ( $solvedComment->hidden() == 0 OR ( \in_array( $solvedComment->hidden(), array( 1, -1 ) ) AND $solvedComment->canUnhide() ) )}}
|
|
<div class='ipsMessage ipsMessage--success ipsPull'>
|
|
<div class='i-flex i-justify-content_space-between i-align-items_center i-flex-wrap_wrap i-gap_1'>
|
|
<div class='i-flex_11'>
|
|
<h4 class='ipsMessage__title'>{lang="solved_byline" htmlsprintf="$solvedComment->author()->name"}</h4>
|
|
<div class='i-color_soft'>{datetime="$solvedComment->mapped('date')"}</div>
|
|
</div>
|
|
<a href="{$topic->url()->setQueryString( array( 'do' => 'findComment', 'comment' => $topic->topic_answered_pid ))}" rel="nofollow" class='ipsButton ipsButton--inherit'><span>{lang="solved_and_go"}</span><i class="fa-solid fa-arrow-right"></i></a>
|
|
</div>
|
|
</div>
|
|
{{endif}}]]></template>
|
|
<template template_group="widgets" template_name="forumStatistics" template_data="$stats, $layout='table', $isCarousel=false" template_location="front" template_app="forums"><![CDATA[<h3 class='ipsWidget__header'>{lang="block_forumStatistics"}</h3>
|
|
<div class="ipsWidget__content">
|
|
<ul class='ipsList ipsList--stats ipsList--stacked ipsList--border ipsList--fill'>
|
|
<li>
|
|
<strong class='ipsList__label'>{lang="total_topics"}</strong>
|
|
<span class='ipsList__value'>{number="$stats['total_topics']" format="short"}</span>
|
|
</li>
|
|
<li>
|
|
<strong class='ipsList__label'>{lang="total_posts"}</strong>
|
|
<span class='ipsList__value'>{number="$stats['total_posts']" format="short"}</span>
|
|
</li>
|
|
</ul>
|
|
</div>]]></template>
|
|
<template template_group="widgets" template_name="poll" template_data="$topic, $poll, $layout='table', $isCarousel=false" template_location="front" template_app="forums">{$poll|raw}
|
|
</template>
|
|
<template template_group="widgets" template_name="pollFormWidget" template_data="$url, $id, $action, $elements, $hiddenValues, $actionButtons, $uploadField, $class='', $attributes=array(), $sidebar=NULL, $form=NULL" template_location="front" template_app="forums"><![CDATA[<form accept-charset='utf-8' class="ipsForm {$class} ipsForm--poll-widget" action="{$url->setQueryString( 'do', 'widgetPoll' )}" method="post" {{if $uploadField}}enctype="multipart/form-data"{{endif}} {{foreach $attributes as $k => $v}}{$k}="{$v}"{{endforeach}} data-ipsForm>
|
|
<input type="hidden" name="{$id}_submitted" value="1">
|
|
{{foreach $hiddenValues as $k => $v}}
|
|
<input type="hidden" name="{$k}" value="{$v}">
|
|
{{endforeach}}
|
|
{{foreach $elements as $collection}}
|
|
<ol class='ipsPollList ipsPollList--questions'>
|
|
{{$i = 0;}}
|
|
{{foreach $collection as $idx => $input}}
|
|
{{$i++;}}
|
|
<li class='ipsFieldRow ipsFieldRow--noLabel'>
|
|
<h4 class='i-font-weight_600'>{$i}. {$input->label}</h4>
|
|
{{if !$input->options['multiple']}}
|
|
{template="radio" app="core" location="global" group="forms" params="$input->name, $input->value, $input->required, $input->options['options'], $input->options['disabled'], '', $input->options['disabled']"}
|
|
{{else}}
|
|
{template="checkboxset" app="core" location="global" group="forms" params="$input->name, $input->value, $input->required, $input->options['options'], FALSE, NULL, $input->options['disabled'], $input->options['toggles'], NULL, NULL, 'all', array(), TRUE, isset( $input->options['descriptions'] ) ? $input->options['descriptions'] : NULL, FALSE, FALSE, $input->options['condense']"}
|
|
{{endif}}
|
|
{{if $input->error}}
|
|
<div class="ipsFieldRow__warning">{lang="$input->error"}</div>
|
|
{{endif}}
|
|
</li>
|
|
{{endforeach}}
|
|
</ol>
|
|
{{endforeach}}
|
|
<div class='ipsSubmitRow'>
|
|
<ul class="ipsButtons ipsButtons--fill">
|
|
{{foreach $actionButtons as $button}}
|
|
<li>{$button|raw}</li>
|
|
{{endforeach}}
|
|
<li>
|
|
<a class='ipsButton ipsButton--inherit' title='{lang="show_results_title"}' href="{$url->setQueryString('do', 'widgetPoll')->setQueryString( array( '_poll' => 'results', 'nullVote' => 1 ) )->csrf()}" {{if !settings.allow_result_view}}data-viewResults-confirm="{lang="warn_allow_result_view"}"{{endif}} data-action='viewResults'>
|
|
{lang="show_results"}
|
|
</a>
|
|
</li>
|
|
<li>
|
|
<a class='ipsButton ipsButton--inherit' title='{lang="show_results_title"}' href="{$url}">
|
|
{lang="poll_view_topic"}
|
|
</a>
|
|
</li>
|
|
</ul>
|
|
</div>
|
|
</form>]]></template>
|
|
<template template_group="widgets" template_name="pollWidget" template_data="$poll, $url, $layout='table', $isCarousel=false" template_location="front" template_app="forums"><![CDATA[{{if !isset( \IPS\Request::i()->fetchPoll )}}
|
|
<section data-controller='core.front.core.poll'>
|
|
{{endif}}
|
|
{{if $poll->canVote() and request._poll != 'results' and ( !$poll->getVote() or request._poll == 'form') and $pollForm = $poll->buildForm()}}
|
|
<h3 class='ipsWidget__header'>
|
|
<span>{$poll->poll_question}</span>
|
|
<span class='ipsWidget__header-secondary i-color_soft' data-ipsTooltip title='{lang="poll_num_votes" pluralize="$poll->votes"}'><i class='fa-regular fa-check-square'></i> {$poll->votes}</span>
|
|
</h3>
|
|
<div class='ipsWidget__content' data-role='pollContents'>
|
|
{$pollForm->customTemplate( array( \IPS\Theme::i()->getTemplate( 'widgets', 'forums', 'front' ), 'pollFormWidget' ), $url )|raw}
|
|
</div>
|
|
{{elseif ( $poll->canViewResults() and !$poll->canVote() ) or $poll->getVote() or ( request._poll == 'results' and settings.allow_result_view )}}
|
|
<h3 class='ipsWidget__header'>
|
|
<span>{$poll->poll_question}</span>
|
|
<span class='ipsWidget__header-secondary i-color_soft' data-ipsTooltip title='{lang="poll_num_votes" pluralize="$poll->votes"}'><i class='fa-regular fa-check-square'></i> {$poll->votes}</span>
|
|
</h3>
|
|
<div class='ipsWidget__content' data-role='pollContents'>
|
|
<i-data>
|
|
<ol class='ipsPollList ipsData'>
|
|
{{$i = 0;}}
|
|
{{foreach $poll->choices as $questionId => $question}}
|
|
{{$i++;}}
|
|
<li class='ipsData__item'>
|
|
<div>
|
|
<h3 class='ipsTitle ipsTitle--h6'>{$i}. {$question['question']}</h3>
|
|
<ul class='ipsPollList_choices i-grid i-gap_2 i-margin-top_3'>
|
|
{{foreach $question['choice'] as $k => $choice}}
|
|
<li>
|
|
<div class='i-font-weight_500 i-margin-bottom_1'>{$choice|raw}</div>
|
|
<progress class='ipsProgress' max="100" value='{{if array_sum( $question['votes'] ) > 0 }}{expression="\intval( ( $question['votes'][ $k ] / array_sum( $question['votes'] ) ) * 100 )"}{{else}}0{{endif}}' title='{{if array_sum( $question['votes'] ) > 0 }}{expression="\intval( ( $question['votes'][ $k ] / array_sum( $question['votes'] ) ) * 100 )"}{{else}}0{{endif}}%' data-ipstooltip></progress>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</div>
|
|
</li>
|
|
{{endforeach}}
|
|
</ol>
|
|
</i-data>
|
|
<div class='ipsSubmitRow'>
|
|
<ul class='ipsButtons ipsButtons--fill'>
|
|
{{if $poll->canVote()}}
|
|
<li>
|
|
<a href="{$url->setQueryString('do', 'widgetPoll')->setQueryString( '_poll', 'form' )}" title='{lang="show_vote_options"}' class='ipsButton ipsButton--inherit' data-action='viewResults'><i class='fa-solid fa-caret-left'></i><span>{lang="show_vote_options"}</span></a>
|
|
</li>
|
|
{{endif}}
|
|
<li>
|
|
<a class='ipsButton ipsButton--inherit' href="{$url}">{lang="poll_view_topic"}</a>
|
|
</li>
|
|
</ul>
|
|
{{if !member.member_id}}
|
|
<div class='i-margin-top_2 i-text-align_center'>
|
|
{lang="poll_guest" sprintf="\IPS\Http\Url::internal( 'app=core&module=system&controller=login', 'front', 'login' ), \IPS\Http\Url::internal( 'app=core&module=system&controller=register', 'front', 'register' )"}
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
</div>
|
|
{{else}}
|
|
<h3 class='ipsWidget__header'>
|
|
<span>
|
|
{$poll->poll_question}
|
|
</span>
|
|
<span class='ipsWidget__header-secondary' data-ipsTooltip title='{lang="poll_num_votes" pluralize="$poll->votes"}'><i class='fa-regular fa-check-square'></i> {$poll->votes}</span>
|
|
</h3>
|
|
<div class='ipsWidget__padding ipsWidget__content' data-role='pollContents'>
|
|
{lang="no_permission_poll"}{{if !\IPS\Member::loggedIn()->member_id}} {lang="poll_guest" sprintf="\IPS\Http\Url::internal( 'app=core&module=system&controller=login', 'front', 'login' ), \IPS\Http\Url::internal( 'app=core&module=system&controller=register', 'front', 'register' )"}{{endif}}
|
|
</div>
|
|
{{endif}}
|
|
{{if !isset( \IPS\Request::i()->fetchPoll )}}
|
|
</section>
|
|
{{endif}}]]></template>
|
|
<template template_group="widgets" template_name="postFeed" template_data="$comments, $title, $layout='table', $isCarousel=false" template_location="front" template_app="forums"><![CDATA[{{if !empty( $comments ) }}
|
|
<header class='ipsWidget__header'>
|
|
<h3>{$title}</h3>
|
|
{{if $isCarousel}}
|
|
{{$carouselID = 'widget-topic-feed_' . mt_rand();}}
|
|
{template="carouselNavigation" group="global" app="core" params="$carouselID"}
|
|
{{endif}}
|
|
</header>
|
|
<div class='ipsWidget__content'>
|
|
<i-data>
|
|
<ul class='ipsData ipsData--{$layout} {{if $isCarousel}}ipsData--carousel{{endif}} ipsData--widget-forums-postFeed' {{if $isCarousel}}id='{$carouselID}' tabindex="0"{{endif}}>
|
|
{{foreach $comments as $comment}}
|
|
<li class='ipsData__item'>
|
|
<a href='{$comment->url()}' class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{$comment->item()->title}</span></a>
|
|
{{if in_array($layout, array("wallpaper", "featured", "grid"))}}
|
|
<figure class='ipsData__image' data-show-on="wallpaper featured grid">
|
|
{{if $image = $comment->item()->primaryImage()}}
|
|
<img src="{$image->url}" alt="{$comment->item()->title}" loading="lazy">
|
|
{{else}}
|
|
<i></i>
|
|
{{endif}}
|
|
</figure>
|
|
{{else}}
|
|
<figure class='ipsData__icon' data-hide-on="wallpaper featured grid">
|
|
{template="userPhoto" app="core" group="global" params="$comment->author(), 'fluid'"}
|
|
</figure>
|
|
{{endif}}
|
|
<div class="ipsData__content">
|
|
<div class='ipsData__main'>
|
|
<div class='ipsData__title'>
|
|
<h4><a href="{$comment->url()}" title='{lang="view_this_topic" sprintf="$comment->item()->title"}'>{$comment->item()->title}</a></h4>
|
|
{{if $comment->item()->isSolved()}}
|
|
<div class='ipsBadges'>
|
|
<span class="ipsBadge ipsBadge--icon ipsBadge--positive" data-ipsTooltip title='{lang="this_is_solved"}'><i class='fa-solid fa-check'></i></span>
|
|
</div>
|
|
{{endif}}
|
|
</div>
|
|
<div class='ipsData__desc ipsRichText' data-controller='core.front.core.lightboxedImages'>{$comment->truncated()|raw}</div>
|
|
<p class='ipsData__meta'>{lang="byline_itemprop" htmlsprintf="$comment->author()->link( NULL, NULL, $comment->isAnonymous() )"} <a href='{$comment->item()->url()->setQueryString( array( 'do' => 'findComment', 'comment' => $comment->pid ) )}'>{$comment->dateLine()|raw}</a></p>
|
|
</div>
|
|
</div>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
</i-data>
|
|
</div>
|
|
{{endif}}
|
|
]]></template>
|
|
<template template_group="widgets" template_name="topicFeed" template_data="$topics, $title, $layout='table', $isCarousel=false" template_location="front" template_app="forums"><![CDATA[{{if !empty( $topics ) }}
|
|
<header class='ipsWidget__header'>
|
|
<h3>{$title}</h3>
|
|
{{if $isCarousel}}
|
|
{{$carouselID = 'widget-topic-feed_' . mt_rand();}}
|
|
{template="carouselNavigation" group="global" app="core" params="$carouselID"}
|
|
{{endif}}
|
|
</header>
|
|
<div class='ipsWidget__content'>
|
|
<i-data>
|
|
<ul class="ipsData ipsData--{$layout} {{if $isCarousel}}ipsData--carousel{{endif}} ipsData--topic-feed-widget" {{if $isCarousel}}id='{$carouselID}' tabindex="0"{{endif}}>
|
|
{{foreach $topics as $topic}}
|
|
{template="topicFeedRow" group="widgets" app="forums" location="front" params="$topic, $layout"}
|
|
{{endforeach}}
|
|
</ul>
|
|
</i-data>
|
|
</div>
|
|
{{endif}}]]></template>
|
|
<template template_group="widgets" template_name="topicFeedRow" template_data="$topic, $layout='table', $isCarousel=false" template_location="front" template_app="forums"><![CDATA[<li data-ips-hook="row" class="ipsData__item {{if method_exists( $topic, 'tableClass' ) && $topic->tableClass()}}ipsData__item--{$topic->tableClass()}{{endif}} {{if $topic->hidden()}}ipsModerated{{endif}}">
|
|
<a href='{$topic->url( "getPrefComment" )}' class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{$topic->mapped('title')}</span></a>
|
|
{{if in_array($layout, array("wallpaper", "featured", "grid"))}}
|
|
<figure class='ipsData__image' data-show-on="wallpaper featured grid">
|
|
{{if $image = $topic->primaryImage()}}
|
|
<img src="{$image->url}" alt="{$topic->mapped( 'title' )}" loading="lazy">
|
|
{{else}}
|
|
<i></i>
|
|
{{endif}}
|
|
</figure>
|
|
{{else}}
|
|
<figure class='ipsData__icon' data-hide-on="wallpaper featured grid">
|
|
{template="userPhoto" app="core" group="global" params="$topic->author(), 'fluid'"}
|
|
</figure>
|
|
{{endif}}
|
|
<div class='ipsData__content'>
|
|
<div class='ipsData__main'>
|
|
{{if \IPS\Request::i()->controller != 'forums'}}
|
|
<div class="ipsData__category" data-hide-on="minimal"><a href="{$topic->container()->url()}">{$topic->container()->_formattedTitle|raw}</a></div>
|
|
{{endif}}
|
|
<div class='ipsData__title'>
|
|
{{if $topic->prefix()}}
|
|
{template="prefix" group="global" app="core" params="$topic->prefix( TRUE ), $topic->prefix()"}
|
|
{{endif}}
|
|
<h4 data-ips-hook="title">
|
|
<a href='{$topic->url( "getPrefComment" )}' {{if $topic->tableHoverUrl AND $topic->canView()}}data-ipsHover data-ipsHover-target='{$topic->url()->setQueryString('preview', 1)}' data-ipsHover-timeout='1.5' {{endif}}>
|
|
{$topic->mapped('title')}
|
|
</a>
|
|
</h4>
|
|
<div data-ips-hook="badges" class="ipsBadges">
|
|
{{foreach $topic->badges() as $badge}}{$badge|raw}{{endforeach}}
|
|
</div>
|
|
{{if \in_array( $layout, array("list"))}}
|
|
{{if $topic->commentPageCount() > 1}}
|
|
{$topic->commentPagination( array(), 'miniPagination' )|raw}
|
|
{{endif}}
|
|
{{endif}}
|
|
</div>
|
|
<div class='ipsData__meta' data-hide-on="mini-grid">
|
|
{lang="byline_name_date" htmlsprintf="$topic->author()->link( NULL, NULL, $topic->isAnonymous() ), \IPS\DateTime::ts( $topic->mapped('date') )->html(FALSE)"}
|
|
</div>
|
|
{{if $layout === "featured"}}
|
|
<div class='ipsData__desc'>{$topic->truncated(TRUE)|raw}</div>
|
|
{{endif}}
|
|
</div>
|
|
<div class="ipsData__extra" data-hide-on="minimal">
|
|
<ul data-ips-hook="stats" class='ipsData__stats'>
|
|
{{foreach $topic->stats(FALSE) as $k => $v}}
|
|
<li {{if \in_array( $k, $topic->hotStats )}}class="ipsData__stats-hot" data-text='{lang="hot_item"}' data-ipsTooltip title='{lang="hot_item_desc"}'{{endif}} data-statType='{$k}' {{if $v === 0}}data-v="{$v}"{{endif}}>
|
|
<span class='ipsData__stats-icon' data-stat-value="{number='$v'}" aria-hidden="true" data-ipstooltip title='{number="$v" format="short"} {lang="{$k}" pluralize="$v" format="short"}'></span>
|
|
<span class='ipsData__stats-label'>{number="$v"} {lang="{$k}" pluralize="$v"}</span>
|
|
</li>
|
|
{{endforeach}}
|
|
</ul>
|
|
<div class="ipsData__last" data-ips-hook="latestUserPhoto">
|
|
{{if $topic->mapped('num_comments')}}
|
|
{template="userPhoto" app="core" group="global" params="$topic->lastCommenter(), 'fluid'"}
|
|
{{else}}
|
|
{template="userPhoto" app="core" group="global" params="$topic->author(), 'fluid'"}
|
|
{{endif}}
|
|
<div class="ipsData__last-text">
|
|
<div class="ipsData__last-primary">
|
|
{{if $topic->mapped('num_comments')}}
|
|
{$topic->lastCommenter()->link()|raw}
|
|
{{else}}
|
|
{$topic->author()->link( NULL, NULL, $topic->isAnonymous() )|raw}
|
|
{{endif}}
|
|
</div>
|
|
<div class="ipsData__last-secondary">
|
|
<a href='{$topic->url( 'getLastComment' )}' title='{lang="get_last_post"}'>
|
|
{{if $topic->mapped('last_comment')}}{datetime="$topic->mapped('last_comment')"}{{else}}{datetime="$topic->mapped('date')"}{{endif}}
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</li>]]></template>
|
|
<css css_location="front" css_app="forums" css_attributes="" css_path="." css_name="forums.css"><![CDATA[/* Grid UI */
|
|
.ipsData--forum-grid{
|
|
|
|
}
|
|
|
|
.ipsData--forum-grid .ipsData__stats + .ipsData__last{
|
|
padding-top: 1em;
|
|
}
|
|
|
|
|
|
/*
|
|
----------------
|
|
- Category with feed
|
|
Used on the 'content view' forum layout
|
|
----------------
|
|
*/
|
|
|
|
.ipsCategoryWithFeed{
|
|
container: ipsCategoryWithFeed / inline-size;
|
|
}
|
|
|
|
.ipsCategoryWithFeed__item{
|
|
border-top: 6px solid var(--i-featured, var(--i-background_6));
|
|
}
|
|
|
|
.ipsData--forumFeedViewParent{
|
|
grid-template-columns: 1fr;
|
|
}
|
|
|
|
.ipsData--forumFeedViewParent .ipsData__stats{
|
|
font-weight: 550;
|
|
color: var(--i-color_root);
|
|
}
|
|
|
|
/* Large UI */
|
|
@container ipsCategoryWithFeed (min-width: 650.1px){
|
|
/* 2 column UI */
|
|
.ipsCategoryWithFeed__item{
|
|
display: grid;
|
|
grid-template-columns: clamp(280px, 33%, 350px) 1fr;
|
|
}
|
|
/* Photo, title, description */
|
|
.ipsCategoryWithFeed__meta{
|
|
border-inline-end: 1px solid var(--i-background_4);
|
|
}
|
|
|
|
.ipsData--forumFeedViewParent{
|
|
height: 100%;
|
|
}
|
|
|
|
/* Prepare the list for the following 2 changes */
|
|
.ipsData--forumFeedView{
|
|
--i-data--padding: 1.1em;
|
|
--i-data--cell-spacing: 1em;
|
|
--i-data--icon-width: 30px;
|
|
|
|
height: 100%;
|
|
display: flex;
|
|
flex-direction: column;
|
|
}
|
|
}
|
|
|
|
/* Small UI */
|
|
@container ipsCategoryWithFeed (max-width: 650px) {
|
|
|
|
/* Forum name and meta */
|
|
.ipsData.ipsData--forumFeedViewParent{
|
|
--i-data--padding: 1.2em;
|
|
--i-data--icon-ratio: 1;
|
|
}
|
|
|
|
.ipsData--forumFeedViewParent .ipsData__item{
|
|
flex-direction: row;
|
|
align-items: start;
|
|
}
|
|
.ipsData--forumFeedViewParent .ipsData__image{
|
|
flex: 0 0 clamp(60px, 17vw, 120px);
|
|
margin: 0;
|
|
}
|
|
|
|
/* Scrollable topic list */
|
|
.ipsData--forumFeedView {
|
|
--i-data--gap: 1.2em;
|
|
padding: 1em var(--i-data--gap);
|
|
display: flex;
|
|
gap: 1px;
|
|
overflow: auto;
|
|
scroll-snap-type: x mandatory;
|
|
scroll-padding: var(--i-data--gap);
|
|
scrollbar-width: thin;
|
|
scrollbar-color: color-mix(in srgb, var(--i-co) 20%, transparent) transparent;
|
|
}
|
|
|
|
.ipsData--forumFeedView .ipsData__item{
|
|
flex: 0 0 min(80vw, 400px);
|
|
border-width: 0;
|
|
scroll-snap-align: start;
|
|
outline: 1px solid var(--i-background_4);
|
|
}
|
|
.ipsData--forumFeedView .ipsData__item:first-child{
|
|
border-start-start-radius: min(var(--i-design-radius), 6px);
|
|
border-end-start-radius: min(var(--i-design-radius), 6px);
|
|
}
|
|
.ipsData--forumFeedView .ipsData__item:last-child{
|
|
border-start-end-radius: min(var(--i-design-radius), 6px);
|
|
border-end-end-radius: min(var(--i-design-radius), 6px);
|
|
}
|
|
.ipsData--forumFeedView .ipsData__icon{
|
|
align-self: center;
|
|
}
|
|
.ipsData--forumFeedView .ipsData__title{
|
|
white-space: nowrap;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Topic hover cards */
|
|
.cTopicHovercard .cTopicHovercard_container {
|
|
height: 200px;
|
|
overflow: auto;
|
|
}
|
|
|
|
/* Reactions in expanded view */
|
|
.ipsData--snippet-topic-list .ipsReactOverview--reactions a{
|
|
display: block; /* Necessary for alignment */
|
|
}
|
|
.ipsData--snippet-topic-list .ipsReactOverview--reactions img{
|
|
height: 1.3em;
|
|
display: block;
|
|
}
|
|
|
|
.ipsData--snippet-topic-list .ipsReactOverview--points{
|
|
display: flex;
|
|
align-items: center;
|
|
}
|
|
|
|
.ipsData--snippet-topic-list .ipsReactOverview--points p{
|
|
margin-inline-start: .6em;
|
|
}
|
|
|
|
/* Hide reaction overview if empty */
|
|
.ipsData__item--snippet .ipsReactOverview--none{
|
|
display: none;
|
|
}
|
|
|
|
|
|
/* Mini sidebar list */
|
|
.cForumMiniList_wrapper {
|
|
padding: .5em;
|
|
font-weight: 500;
|
|
}
|
|
|
|
.cForumMiniList :where(a){
|
|
display: flex;
|
|
align-items: center;
|
|
gap: .6em;
|
|
padding: .5em 1em;
|
|
color: var(--i-color_root);
|
|
border-radius: var(--i-design-radius);
|
|
}
|
|
|
|
:where(.cForumMiniList a:hover){
|
|
background-color: var(--i-background_2);
|
|
}
|
|
|
|
/* Active */
|
|
.cForumMiniList__selected {
|
|
background-color: var(--i-background_3);
|
|
}
|
|
|
|
/* Unread */
|
|
.cForumMiniList [data-ips-unread]{
|
|
color: var(--i-color_hard);
|
|
font-weight: 700;
|
|
}
|
|
|
|
/* Category titles */
|
|
.cForumMiniList [data-category] > a {
|
|
font-size: 1.3em;
|
|
font-weight: 600;
|
|
}
|
|
|
|
.cForumMiniList [data-category]:not(:first-child){
|
|
margin-top: 1em;
|
|
}
|
|
|
|
/* Indent sub-categories */
|
|
.cForumMiniList .cForumMiniList .cForumMiniList{
|
|
margin-inline-start: 1.5em;
|
|
}
|
|
|
|
.cForumMiniList__count {
|
|
font-size: .85em;
|
|
flex: 0 0 auto;
|
|
color: var(--i-color_soft);
|
|
margin-inline-start: auto;
|
|
}
|
|
|
|
.cForumMiniList .cForumMiniList__blob {
|
|
background: var(--i-featured, var(--i-background_6));
|
|
color: #fff;
|
|
flex: 0 0 auto;
|
|
font-size: 16px;
|
|
width: 1em;
|
|
height: 1em;
|
|
border-radius: 5px;
|
|
display: inline-grid;
|
|
place-items: center;
|
|
transform: scale(.5);
|
|
transition: .2s;
|
|
}
|
|
|
|
.cForumMiniList .cForumMiniList__blob [class*="fa-"] {
|
|
display: none;
|
|
font-size: .6em;
|
|
}
|
|
|
|
.cForumMiniList .cForumMiniList__selected > .cForumMiniList__blob {
|
|
opacity: 1;
|
|
transform: scale(1);
|
|
}
|
|
|
|
.cForumMiniList .cForumMiniList__selected > .cForumMiniList__blob [class*="fa-"] {
|
|
display: block;
|
|
}
|
|
|
|
/* Read: Make icon background subtle */
|
|
.cForumMiniList [data-ips-read] > .cForumMiniList__blob{
|
|
background-color: var(--i-background_6);
|
|
}
|
|
|
|
|
|
/* v5 todo: Audit this code */
|
|
|
|
/* BOTH */
|
|
@media screen and (max-width: 979px) {
|
|
.cForumMiniList_wrapper {
|
|
display: none;
|
|
}
|
|
|
|
.ipsDialog #elFluidFormFilters {
|
|
border: 0;
|
|
}
|
|
|
|
.ipsDialog .cForumMiniList_wrapper,
|
|
.cForumMiniList {
|
|
display: block !important;
|
|
}
|
|
|
|
}]]></css>
|
|
<css css_location="front" css_app="forums" css_attributes="" css_path="." css_name="topics.css">@media (max-width: 1150px){
|
|
.cTopicOverview{
|
|
flex-direction: column;
|
|
}
|
|
}
|
|
|
|
.cTopicOverview--row{
|
|
background-color: var(--i-box--ba-co);
|
|
background-clip: padding-box;
|
|
border-radius: var(--i-box--bo-ra);
|
|
border: 1px solid color-mix(in srgb, var(--i-co) 10%, transparent);
|
|
overflow: hidden;
|
|
margin: .5em;
|
|
}
|
|
|
|
.cTopicOverview__toggle {
|
|
display: block;
|
|
padding: .5em;
|
|
transition: 0.1s all ease-in-out;
|
|
}
|
|
|
|
.cTopicOverview__toggle i[class*=" fa-"] {
|
|
display: grid;
|
|
place-content: center;
|
|
height: 100%;
|
|
max-height: 80px;
|
|
transition: 0.2s all ease-in-out;
|
|
}
|
|
|
|
.cTopicOverview--expanded .cTopicOverview__toggle i[class*=" fa-"] {
|
|
transform: rotate(180deg);
|
|
}
|
|
|
|
.cTopicOverview__toggle:hover {
|
|
background: var(--i-background_2);
|
|
}
|
|
|
|
.cTopicOverview__toggle--row {
|
|
display: none;
|
|
}
|
|
|
|
.cTopicOverview__dataItemInner {
|
|
text-overflow: ellipsis;
|
|
overflow: hidden;
|
|
line-height: 1.2;
|
|
}
|
|
|
|
.cTopicOverview__preview {
|
|
position: relative;
|
|
overflow: hidden;
|
|
min-height: 90px;
|
|
}
|
|
|
|
.cTopicOverview__preview::after {
|
|
content: '';
|
|
pointer-events: none;
|
|
display: block;
|
|
position: absolute;
|
|
inset-inline-end: 0;
|
|
top: 0;
|
|
bottom: 0;
|
|
background-image: linear-gradient(to right, color-mix(in srgb, var(--i-box--ba-co) 0%, transparent) 0%, var(--i-box--ba-co) 100%);
|
|
width: 250px;
|
|
}
|
|
|
|
.cTopicOverview__preview .ipsUserPhoto--tiny {
|
|
max-width: 28px;
|
|
}
|
|
|
|
.cTopicOverview__previewInner {
|
|
position: absolute;
|
|
inset: 0;
|
|
}
|
|
|
|
@media screen and (max-width: 1150px) {
|
|
.cTopicOverview {
|
|
flex-direction: column;
|
|
}
|
|
|
|
.cTopicOverview__preview,
|
|
.cTopicOverview__toggle--afterStats {
|
|
display: none;
|
|
}
|
|
|
|
.cTopicOverview__toggle--row {
|
|
display: block;
|
|
}
|
|
}
|
|
|
|
|
|
/* Topic meta */
|
|
.ipsTopicMeta {
|
|
margin-bottom: 1em;
|
|
padding: .5em 1em;
|
|
display: grid;
|
|
gap: .5em;
|
|
color: var(--i-color_soft);
|
|
font-weight: 500;
|
|
font-size: .9em;
|
|
}
|
|
|
|
/* Automatic contrast against page background */
|
|
@supports (color: oklch(from var(--i) clamp(0, (.60 - l) * 1000, 1) c h)) and (color: oklch(from red l c h)){
|
|
.ipsTopicMeta:not(.ipsBox *){
|
|
color: oklch(from var(--i-body--ba-co) clamp(0, (.60 - l) * 1000, 1) c h);
|
|
}
|
|
}
|
|
|
|
.ipsBox .ipsTopicMeta{
|
|
margin: 0;
|
|
border-top: 1px solid var(--i-background_3);
|
|
background: var(--i-background_2)
|
|
}
|
|
|
|
.ipsTopicMeta a{
|
|
color: inherit;
|
|
}
|
|
|
|
@media (min-width: 768px){
|
|
.ipsEntry--post ~ .ipsTopicMeta {
|
|
padding-inline-start: var(--post-column--fl-ba, 240px);
|
|
}
|
|
}
|
|
|
|
.ipsTopicMeta__time {
|
|
margin-inline-end: var(--i-sp_2);
|
|
}
|
|
|
|
|
|
/* Hide certain elements depending on traditional, minimal and first page attributes */
|
|
#ipsTopicView[data-ips-topic-ui="traditional"][data-ips-topic-first-page="true"] [data-ips-hide="traditional-first"],
|
|
#ipsTopicView[data-ips-topic-ui="minimal"] [data-ips-hide="minimal"],
|
|
#ipsTopicView[data-ips-topic-comments="helpful"] .ipsTopicMeta{
|
|
display: none;
|
|
}
|
|
|
|
/* Improve alignment of assigned icon */
|
|
.ipsMessage--assigned .ipsMessage__icon{
|
|
top: calc(50% - .5em);
|
|
}</css>
|
|
</theme>
|