Version 5.0.0 beta 5

This commit is contained in:
Neo committed 2025-12-19 17:04:22 -08:00
1 parent 2f24f9de48
commit 57d9db6ce2
218 files changed
+5331 -7416

No files matched your search

+10 -10
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<javascript app="forums">
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/forum" javascript_name="ips.forum.flow.js" javascript_type="controller" javascript_version="5000030" javascript_position="1000100"><![CDATA[/**
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/forum" javascript_name="ips.forum.flow.js" javascript_type="controller" javascript_version="5000031" javascript_position="1000100"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -272,7 +272,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/forum" javascript_name="ips.forum.forumList.js" javascript_type="controller" javascript_version="5000030" javascript_position="1000100"><![CDATA[/**
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/forum" javascript_name="ips.forum.forumList.js" javascript_type="controller" javascript_version="5000031" javascript_position="1000100"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -340,7 +340,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/forum" javascript_name="ips.forum.forumPage.js" javascript_type="controller" javascript_version="5000030" javascript_position="1000100"><![CDATA[/**
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/forum" javascript_name="ips.forum.forumPage.js" javascript_type="controller" javascript_version="5000031" javascript_position="1000100"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -397,7 +397,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/forum" javascript_name="ips.forum.hovercard.js" javascript_type="controller" javascript_version="5000030" javascript_position="1000100">/**
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/forum" javascript_name="ips.forum.hovercard.js" javascript_type="controller" javascript_version="5000031" javascript_position="1000100">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -447,7 +447,7 @@
}
});
}(jQuery, _));</file>
<file javascript_app="forums" javascript_location="admin" javascript_path="controllers/settings" javascript_name="ips.settings.archiveRules.js" javascript_type="controller" javascript_version="5000030" javascript_position="1000050"><![CDATA[/**
<file javascript_app="forums" javascript_location="admin" javascript_path="controllers/settings" javascript_name="ips.settings.archiveRules.js" javascript_type="controller" javascript_version="5000031" javascript_position="1000050"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -512,7 +512,7 @@
});
}(jQuery, _));
]]></file>
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/topic" javascript_name="ips.topic.activity.js" javascript_type="controller" javascript_version="5000030" javascript_position="1000050">/**
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/topic" javascript_name="ips.topic.activity.js" javascript_type="controller" javascript_version="5000031" javascript_position="1000050">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -534,7 +534,7 @@
}
});
}(jQuery, _));</file>
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/topic" javascript_name="ips.topic.answers.js" javascript_type="controller" javascript_version="5000030" javascript_position="1000050"><![CDATA[/**
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/topic" javascript_name="ips.topic.answers.js" javascript_type="controller" javascript_version="5000031" javascript_position="1000050"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -674,7 +674,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/topic" javascript_name="ips.topic.reply.js" javascript_type="controller" javascript_version="5000030" javascript_position="1000050">/**
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/topic" javascript_name="ips.topic.reply.js" javascript_type="controller" javascript_version="5000031" javascript_position="1000050">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -703,7 +703,7 @@
}
});
}(jQuery, _));</file>
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/topic" javascript_name="ips.topic.solved.js" javascript_type="controller" javascript_version="5000030" javascript_position="1000050"><![CDATA[/**
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/topic" javascript_name="ips.topic.solved.js" javascript_type="controller" javascript_version="5000031" javascript_position="1000050"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -741,7 +741,7 @@
}
});
}(jQuery, _));]]></file>
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/topic" javascript_name="ips.topic.view.js" javascript_type="controller" javascript_version="5000030" javascript_position="1000050">/**
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/topic" javascript_name="ips.topic.view.js" javascript_type="controller" javascript_version="5000031" javascript_position="1000050">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
+1 -1
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<language>
<app key="forums" version="5000030">
<app key="forums" version="5000031">
<word key="__app_forums" js="0">Forums</word>
<word key="frontnavigation_forums" js="0">Forums</word>
<word key="__indefart_post" js="0">a post in a topic</word>
+22 -311
View File
@@ -424,312 +424,25 @@
{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')}}
&nbsp;<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">
<i-tabs class="ipsTabs ipsTabs--small" id="ipsTabs_topic{$topic->tid}" data-ipsTabBar data-ipsTabBar-contentarea="#ipsTabs_topic{$topic->tid}_content">
<div 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>
<button type="button" id="ipsTabs_topic{$topic->tid}_{$tabID}" class="ipsTabs__tab" role="tab" aria-controls="ipsTabs_topic{$topic->tid}_{$tabID}_panel" aria-selected="{{if $tabID == 'firstPost'}}true{{else}}false{{endif}}">{lang="$tabData[0]"}</button>
{{endforeach}}
</ul>
</div>
{template="tabScrollers" app="core" group="global" location="global"}
</div>
<div id='elTopic_{$topic->tid}_content' class='ipsTabs__panels ipsTabs__panels--padded cTopicHovercard_container ipsScrollbar'>
</i-tabs>
<div id='ipsTabs_topic{$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'>
<div id='ipsTabs_topic{$topic->tid}_{$tabID}_panel' class='ipsTabs__panel' role="tabpanel" aria-labelledby="ipsTabs_topic{$topic->tid}_{$tabID}" {{if $tabID != 'firstPost'}}hidden{{endif}}>
{{endif}}
<div class='ipsPhotoPanel'>
{template="userPhoto" group="global" app="core" params="$tabData[1]->author(), 'fluid'"}
@@ -2497,21 +2210,19 @@
<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'>
<i-tabs class='ipsTabs' id='ipsTabs_topicForm' data-ipsTabBar data-ipsTabBar-contentArea='#ipsTabs_topicForm_content'>
<div 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>
<button type="button" id='ipsTabs_topicForm_{$name}' class="ipsTabs__tab {{if \in_array( $name, $errorTabs )}}ipsTabs__tab--error{{endif}}" role="tab" aria-controls="ipsTabs_topicForm_{$name}_panel" aria-selected="{{if $name == 'topic_mainTab'}}true{{else}}false{{endif}}">
{{if \in_array( $name, $errorTabs )}}<i class="fa-solid fa-circle-exclamation"></i> {{endif}}{lang="$name"}
</button>
{{endforeach}}
</ul>
</div>
{template="tabScrollers" app="core" group="global" location="global"}
</div>
<div id='ipsTabs_content_{$id}' class='ipsTabs__panels'>
</i-tabs>
<div id='ipsTabs_topicForm_content' 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">
<div id='ipsTabs_topicForm_{$name}_panel' class="ipsTabs__panel ipsTabs__panel--{$name}" role="tabpanel" aria-labelledby="ipsTabs_topicForm_{$name}" {{if $name != 'topic_mainTab'}}hidden{{endif}}>
{{if $hasModOptions && $name == 'topic_mainTab'}}
<div class='ipsColumns ipsColumns--new-topic ipsColumns--lines'>
@@ -3100,7 +2811,7 @@ data-first-page="{{if isset( request.page ) and request.page > 1}}false{{else}}t
{{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>
<button class='ipsEntry__topButton ipsEntry__topButton--profile' type='button' aria-controls='mini-profile-{$comment->$idField}' aria-expanded='false' data-ipscontrols aria-label='{lang="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"}
@@ -3653,7 +3364,7 @@ data-first-page="{{if isset( request.page ) and request.page > 1}}false{{else}}t
<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">
<figure class='ipsData__image'>
{{if $image = $comment->item()->primaryImage()}}
<img src="{$image->url}" alt="{$comment->item()->title}" loading="lazy">
{{else}}
@@ -3661,7 +3372,7 @@ data-first-page="{{if isset( request.page ) and request.page > 1}}false{{else}}t
{{endif}}
</figure>
{{else}}
<figure class='ipsData__icon' data-hide-on="wallpaper featured grid">
<figure class='ipsData__icon'>
{template="userPhoto" app="core" group="global" params="$comment->author(), 'fluid'"}
</figure>
{{endif}}
@@ -3707,7 +3418,7 @@ data-first-page="{{if isset( request.page ) and request.page > 1}}false{{else}}t
<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">
<figure class='ipsData__image'>
{{if $image = $topic->primaryImage()}}
<img src="{$image->url}" alt="{$topic->mapped( 'title' )}" loading="lazy">
{{else}}
@@ -3715,7 +3426,7 @@ data-first-page="{{if isset( request.page ) and request.page > 1}}false{{else}}t
{{endif}}
</figure>
{{else}}
<figure class='ipsData__icon' data-hide-on="wallpaper featured grid">
<figure class='ipsData__icon'>
{template="userPhoto" app="core" group="global" params="$topic->author(), 'fluid'"}
</figure>
{{endif}}
@@ -3742,7 +3453,7 @@ data-first-page="{{if isset( request.page ) and request.page > 1}}false{{else}}t
{{endif}}
{{endif}}
</div>
<div class='ipsData__meta' data-hide-on="mini-grid">
<div class='ipsData__meta'>
{lang="byline_name_date" htmlsprintf="$topic->author()->link( NULL, NULL, $topic->isAnonymous() ), \IPS\DateTime::ts( $topic->mapped('date') )->html(FALSE)"}
</div>
{{if $layout === "featured"}}
+2 -1
View File
@@ -278,5 +278,6 @@
"5000027": "5.0.0 Beta 2",
"5000028": "5.0.0 Beta 2",
"5000029": "5.0.0 Beta 3",
"5000030": "5.0.0 Beta 4"
"5000030": "5.0.0 Beta 4",
"5000031": "5.0.0 Beta 5"
}
@@ -448,13 +448,20 @@ class topic extends Controller
'name' => $topic->title,
'text' => $firstPost ? $firstPost->truncated( TRUE, NULL ) : $topic->comments( 1, 0 )->truncated( TRUE, NULL ),
'dateCreated' => DateTime::ts( $topic->start_date )->format( DateTimeInterface::ATOM ),
'answerCount' => ( ( $topic->posts > 1 ) ? ( $topic->posts - 1 ) : 0 ),
'author' => [
'@type' => 'Person',
'name' => $topic->author()->name
'name' => $topic->author()->name,
'image' => $topic->author()->get_photo( TRUE, TRUE )
]
]
);
if( $topic->author()->member_id )
{
Output::i()->jsonLd['topic']['mainEntity']['author']['url'] = (string) $topic->author()->url();
}
if( $topic->topic_answered_pid )
{
try
@@ -508,8 +515,6 @@ class topic extends Controller
$authorIdColumn = $lastComment::$databaseColumnMap['author'];
$dateColumn = $lastComment::$databaseColumnMap['date'];
Output::i()->jsonLd['topic']['mainEntity']['answerCount'] = $topic->posts ? $topic->posts - 1 : 0;
Output::i()->jsonLd['topic']['mainEntity']['suggestedAnswer'] = array(
'@type' => 'Answer',
'text' => $lastComment->truncated( TRUE, NULL ),
@@ -652,6 +657,12 @@ class topic extends Controller
Output::i()->httpHeaders += $httpHeaders;
}
/* $current might be null if the topic has no replies AND we are featuring the first post */
if( empty( $current ) and Member::loggedIn()->getLayoutValue( 'forum_topic_view_firstpost' ) )
{
$current = $firstPost;
}
if( $current )
{
Output::i()->jsonLd['topic'] = array_merge_recursive( array(
@@ -0,0 +1,22 @@
{
"id": 5000031,
"name": "5.0.0 Beta 5",
"steps": {
"queries": false,
"lang": false,
"theme": true,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,27 @@
{
"html": {
"added": [],
"edited": [
"front\/forums\/topicHover",
"front\/submit\/createTopicForm",
"front\/topics\/postHeader",
"front\/widgets\/postFeed",
"front\/widgets\/topicFeedRow"
],
"removed": [
"front\/forums\/popularQuestionRow",
"front\/forums\/qaForum",
"front\/forums\/questionRow"
]
},
"css": {
"added": [],
"edited": [],
"removed": []
},
"resources": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,17 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_forums_forum",
"layout_forums_topic",
"layout_forums_post",
"layout_forum_topic_view_firstpost"
],
"removed": []
}
}