Version 5.0.13

This commit is contained in:
Neo committed 2025-12-19 19:04:57 -08:00
1 parent b89858b2ff
commit 5efe744c5f
1407 files changed
+69690 -30177

No files matched your search

+199 -160
View File
@@ -430,7 +430,7 @@
<template template_key="database_category_articles_entry" template_title="entry" template_desc="" template_location="database" template_group="category_articles" template_params="$record, $database" template_app="" template_type="template"><![CDATA[<article class="ipsData__item {{if $record->hidden()}}ipsModerated{{endif}}" {{if $record->unread()}}data-ips-unread{{else}}data-ips-read{{endif}}>
<a href='{$record->url( "getPrefComment" )}' class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{wordbreak="$record->_title"}</span></a>
{{if $record->showRecordImage()}}
<a href='{$record->url( "getPrefComment" )}' class="ipsData__image" aria-hidden="true" tabindex="-1">
<a href='{$record->url( "getPrefComment" )}' class="ipsData__image" aria-hidden="true" tabindex="-1" aria-hidden="true" tabindex="-1">
{{if $record->record_image}}
<img src='{file="$record->record_image" extension="cms_Records"}' loading="lazy" alt="">
{{else}}
@@ -530,7 +530,7 @@
{{endif}}
{{if \count($articles)}}
<section class='ipsBox ipsPull'>
<section class='ipsBox ipsBox--cmsCategoryArticles ipsPull'>
<i-data>
<div class="ipsData ipsData--entries ipsData--{$database->display_settings['index']['layout']} ipsData--cms-category-articles">
{{foreach $articles as $id => $record}}
@@ -538,21 +538,25 @@
{{endforeach}}
</div>
</i-data>
<div class="ipsButtonBar ipsButtonBar--bottom">
<div class="ipsButtonBar__pagination" data-role="tablePagination">
{template="pagination" app="core" location="global" group="global" params="$url, $pagination['pages'], $pagination['page'], ( $database->field_perpage ?? 25 ), TRUE, 'page'"}
</div>
</div>
</section>
{{endif}}
{template="pagination" app="core" location="global" group="global" params="$url, $pagination['pages'], $pagination['page'], ( $database->field_perpage ?? 25 ), TRUE, 'page'"}]]></template>
{{endif}}]]></template>
<template template_key="database_category_index_categoryRow" template_title="categoryRow" template_desc="" template_location="database" template_group="category_index" template_params="$category" template_app="" template_type="template"><![CDATA[{{$RecordsClass = $category::$contentItemClass;}}
{{if $category->can('view')}}
{{$lastPost = $category->lastPost();}}
<li class="ipsData__item" data-categoryID="{$category->_id}" {{if $RecordsClass::containerUnread( $category )}}data-ips-unread{{else}}data-ips-read{{endif}}>
<a href="{$category->url()}" class="ipsLinkPanel" aria-hidden="true" tabindex="-1"><span>{$category->_title}</span></a>
<figure class="ipsData__image">
<div class="ipsData__image" aria-hidden="true">
{{if $image = $category->primaryImage()}}
<img src="{$image->url}" alt="" loading="lazy">
{{else}}
<span class='ipsIcon ipsIcon--fa' aria-hidden="true"><i class="fa-ips"></i></span>
{{endif}}
</figure>
</div>
<div class="ipsData__content">
<div class="ipsData__main">
<h4 class="ipsData__title">
@@ -623,7 +627,7 @@
</header>
<section>
<ol class='cCmsDatabase_index' data-controller='core.global.core.table, forums.front.forum.forumList' data-baseURL=''>
<li class='ipsBox ipsPull'>
<li class='ipsBox ipsBox--cmsDatabaseCategory ipsPull'>
<h2 class="ipsBox__header">
{lang="content_categories_title"}
</h2>
@@ -735,6 +739,9 @@ data-view-tracking-data="{expression="base64_encode(json_encode( $comment->getVi
{{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}}
{{if $comment->hidden() AND $comment->hidden() != -2}}
<div class='ipsEntry__hiddenMessage'>{$comment->hiddenBlurb()}</div>
{{elseif $comment->hidden() == -2}}
@@ -762,22 +769,26 @@ data-view-tracking-data="{expression="base64_encode(json_encode( $comment->getVi
{{endif}}
{{if $comment->canEdit() || $comment->canSplit() || $comment->canHide()}}
<li>
<a href='#elControlsCommentsSub_{$comment->$idField}_menu' id='elControlsCommentsSub_{$comment->$idField}' data-ipsMenu data-ipsMenu-appendTo='#comment-{$comment->$idField}_wrap'><span>{lang="moderator_tools"}</span><i class='fa-solid fa-caret-down'></i></a>
<ul id='elControlsCommentsSub_{$comment->$idField}_menu' class='ipsMenu ipsMenu_auto 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 )"}">{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"}">{lang="hide"}</a></li>
{{endif}}
</ul>
<button type="button" id="elControlsCommentsSub_{$comment->$idField}" popovertarget="elControlsCommentsSub_{$comment->$idField}_menu"><span>{lang="moderator_tools"}</span><i class='fa-solid fa-caret-down'></i></button>
<i-dropdown popover id="elControlsCommentsSub_{$comment->$idField}_menu">
<div class="iDropdown">
<ul class="iDropdown__items">
{{if $comment->canEdit()}}
{{if $comment->mapped('first') and $comment->item()->canEdit()}}
<li><a href='{$comment->item()->url()->setQueryString( 'do', 'edit' )}'>{lang="edit"}</a></li>
{{else}}
<li><a href='{$comment->url('edit')}' data-action='editComment'>{lang="edit"}</a></li>
{{endif}}
{{endif}}
{{if $comment->canSplit()}}
<li><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 )"}">{lang="split"}</a></li>
{{endif}}
{{if \IPS\IPS::classUsesTrait( $comment, 'IPS\Content\Hideable' ) and $comment->canHide()}}
<li><a href='{$comment->url('hide')->csrf()}' data-ipsDialog data-ipsDialog-title="{lang="hide"}">{lang="hide"}</a></li>
{{endif}}
</ul>
</div>
</i-dropdown>
</li>
{{endif}}
{{else}}
@@ -810,13 +821,17 @@ data-view-tracking-data="{expression="base64_encode(json_encode( $comment->getVi
{{$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' data-ipsMenuValue='showPost'><a href='#'>{lang="show_this_comment"}</a></li>
<li class='ipsMenu_sep'><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>
<i class="fa-solid fa-user-slash"></i> {lang="ignoring_content" sprintf="$comment->author()->name"} <button type="button" id="elIgnoreComment_{$comment->$idField}" popovertarget="elIgnoreComment_{$comment->$idField}_menu" data-action="ignoreOptions" title='{lang="see_post_ignore_options"}'>{lang="options"} <i class='fa-solid fa-caret-down'></i></button>
<i-dropdown popover id="elIgnoreComment_{$comment->$idField}_menu">
<div class="iDropdown">
<ul class="iDropdown__items">
<li><button type="button" data-ipsMenuValue='showPost'>{lang="show_this_comment"}</button></li>
<li><hr></li>
<li><a href='{url="app=core&module=system&controller=ignore&do=remove&id={$comment->author()->member_id}" seoTemplate="ignore"}' data-ipsMenuValue='stopIgnoring'>{lang="stop_ignoring_posts_by" sprintf="$comment->author()->name"}</a></li>
<li><a href='{url="app=core&module=system&controller=ignore" seoTemplate="ignore"}'>{lang="change_ignore_preferences"}</a></li>
</ul>
</div>
</i-dropdown>
</div>
{{endif}}
@@ -949,7 +964,7 @@ data-view-tracking-data="{expression="base64_encode(json_encode( $comment->getVi
</span>
{{endif}}
</p>
<div class="ipsPhotoPanel__secondary">{datetime="$record->mapped( 'date' )"}</div>
<div class="ipsPhotoPanel__secondary">{datetime="$record->mapped( 'date' )"} &middot; {lang="num_views_with_number" pluralize="$record->record_views"}</div>
</div>
</div>
</div>
@@ -1123,46 +1138,50 @@ data-view-tracking-data="{expression="base64_encode(json_encode( $review->getVie
{{if \count( $item->reviewMultimodActions() )}}
<input type="checkbox" name="multimod[{$review->id}]" value="1" data-role="moderation" data-actions="{{if $review->hidden() === -1 AND $review->canUnhide()}}unhide{{elseif $review->hidden() === 1 AND $review->canUnhide()}}approve{{elseif $review->canHide()}}hide{{endif}} {{if $review->canDelete()}}delete{{endif}}" data-state='{{if $review->tableStates()}}{$review->tableStates()}{{endif}}' class="ipsInput ipsInput--toggle">
{{endif}}
<a href='#elControlsReviews_{$review->id}_menu' class='ipsEntry__topButton ipsEntry__topButton--ellipsis' id='elControlsReviews_{$review->id}' title='{lang="more_options"}' data-ipsMenu data-ipsMenu-appendTo='#review-{$review->id}_wrap'><i class='fa-solid fa-ellipsis'></i><span class='ipsInvisible'>{lang="more_options"}</span></a>
<ul id='elControlsReviews_{$review->id}_menu' class='ipsMenu ipsMenu_narrow ipsHide'>
{{if $review->canReportOrRevoke() === TRUE}}
<li class='ipsMenu_item'>
<a href='{$review->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"}"{{endif}} data-action='reportComment' title='{lang="report"}'>{lang="report"}</a>
</li>
{{endif}}
{{if ! \IPS\Output::i()->reduceLinks()}}
<li class='ipsMenu_item'>
<a href='{$review->shareableUrl('review')}' title='{lang="share_this_review"}' data-ipsDialog data-ipsDialog-size='narrow' data-ipsDialog-content='#elShareReview_{$review->id}_menu' data-ipsDialog-title="{lang="share_this_review"}" id='elShareReview_{$review->id}' data-role='shareComment'>{lang="share_this_review"}</a>
</li>
{{endif}}
{{if $review->canEdit() || ( $review->hidden() == -2 AND \IPS\Member::loggedIn()->modPermission('can_manage_deleted_content') ) || ( \IPS\IPS::classUsesTrait( $review, 'IPS\Content\Hideable' ) && ( ( !$review->hidden() and $review->canHide() ) || ( $review->hidden() and $review->canUnhide() ) ) ) || $review->canDelete()}}
<li class='ipsMenu_sep'><hr></li>
{{endif}}
{{if $review->canEdit()}}
<li class='ipsMenu_item'><a href='{$review->url('edit')}' data-action='editComment'>{lang="edit"}</a></li>
{{endif}}
{{if $review->hidden() == -2 AND \IPS\Member::loggedIn()->modPermission('can_manage_deleted_content')}}
<li class='ipsMenu_item'><a href='{$review->url('restore')->csrf()}' data-confirm data-confirmSubMessage='{lang="restore_as_visible_desc"}'>{lang="restore_as_visible"}</a></li>
<li class='ipsMenu_item'><a href='{$review->url('restore')->csrf()->setQueryString( 'restoreAsHidden', 1 )}' data-confirm data-confirmSubMessage='{lang="restore_as_hidden_desc"}'>{lang="restore_as_hidden"}</a></li>
<li class='ipsMenu_item'><a href='{$review->url('delete')->csrf()->setQueryString( 'immediately', 1 )}' data-confirm data-confirmSubMessage='{lang="delete_immediately_desc"}'>{lang="delete_immediately"}</a></li>
{{else}}
{{if \IPS\IPS::classUsesTrait( $review, 'IPS\Content\Hideable' )}}
{{if !$review->hidden() and $review->canHide()}}
<li class='ipsMenu_item'><a href='{{if $review::$hideLogKey}}{$review->url('hide')}{{else}}{$review->url('hide')->csrf()}{{endif}}' data-ipsDialog data-ipsDialog-title="{lang="hide"}">{lang="hide"}</a></li>
{{elseif $review->hidden() and $review->canUnhide()}}
<li class='ipsMenu_item'><a href='{$review->url('unhide')->csrf()}'>{lang="unhide"}</a></li>
<button type="button" id='elControlsReviews_{$review->id}' popovertarget="elControlsReviews_{$review->id}_menu" class='ipsEntry__topButton ipsEntry__topButton--ellipsis' title='{lang="more_options"}'><i class='fa-solid fa-ellipsis'></i><span class='ipsInvisible'>{lang="more_options"}</span></button>
<i-dropdown popover id="elControlsReviews_{$review->id}_menu">
<div class="iDropdown">
<ul class="iDropdown__items">
{{if $review->canReportOrRevoke() === TRUE}}
<li>
<a href='{$review->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"}"{{endif}} data-action='reportComment' title='{lang="report"}'>{lang="report"}</a>
</li>
{{endif}}
{{if \IPS\Application::appIsEnabled('cloud')}}
<li>{template="spam" app="cloud" group="spam" params="$review, FALSE"}</li>
{{endif}}
{{endif}}
{{if $review->canDelete()}}
<li class='ipsMenu_item'><a href='{$review->url('delete')->csrf()->setPage('page',\IPS\Request::i()->page)}' data-action='deleteComment' data-updateOnDelete="#reviewCount">{lang="delete"}</a></li>
{{endif}}
{{endif}}
</ul>
{{if ! \IPS\Output::i()->reduceLinks()}}
<li>
<a href='{$review->shareableUrl('review')}' title='{lang="share_this_review"}' data-ipsDialog data-ipsDialog-size='narrow' data-ipsDialog-content='#elShareReview_{$review->id}_menu' data-ipsDialog-title="{lang="share_this_review"}" id='elShareReview_{$review->id}' data-role='shareComment'>{lang="share_this_review"}</a>
</li>
{{endif}}
{{if $review->canEdit() || ( $review->hidden() == -2 AND \IPS\Member::loggedIn()->modPermission('can_manage_deleted_content') ) || ( \IPS\IPS::classUsesTrait( $review, 'IPS\Content\Hideable' ) && ( ( !$review->hidden() and $review->canHide() ) || ( $review->hidden() and $review->canUnhide() ) ) ) || $review->canDelete()}}
<li><hr></li>
{{endif}}
{{if $review->canEdit()}}
<li><a href='{$review->url('edit')}' data-action='editComment'>{lang="edit"}</a></li>
{{endif}}
{{if $review->hidden() == -2 AND \IPS\Member::loggedIn()->modPermission('can_manage_deleted_content')}}
<li><a href='{$review->url('restore')->csrf()}' data-confirm data-confirmSubMessage='{lang="restore_as_visible_desc"}'>{lang="restore_as_visible"}</a></li>
<li><a href='{$review->url('restore')->csrf()->setQueryString( 'restoreAsHidden', 1 )}' data-confirm data-confirmSubMessage='{lang="restore_as_hidden_desc"}'>{lang="restore_as_hidden"}</a></li>
<li><a href='{$review->url('delete')->csrf()->setQueryString( 'immediately', 1 )}' data-confirm data-confirmSubMessage='{lang="delete_immediately_desc"}'>{lang="delete_immediately"}</a></li>
{{else}}
{{if \IPS\IPS::classUsesTrait( $review, 'IPS\Content\Hideable' )}}
{{if !$review->hidden() and $review->canHide()}}
<li><a href='{{if $review::$hideLogKey}}{$review->url('hide')}{{else}}{$review->url('hide')->csrf()}{{endif}}' data-ipsDialog data-ipsDialog-title="{lang="hide"}">{lang="hide"}</a></li>
{{elseif $review->hidden() and $review->canUnhide()}}
<li><a href='{$review->url('unhide')->csrf()}'>{lang="unhide"}</a></li>
{{endif}}
{{if \IPS\Application::appIsEnabled('cloud')}}
<li>{template="spam" app="cloud" group="spam" params="$review, FALSE"}</li>
{{endif}}
{{endif}}
{{if $review->canDelete()}}
<li><a href='{$review->url('delete')->csrf()->setPage('page',\IPS\Request::i()->page)}' data-action='deleteComment' data-updateOnDelete="#reviewCount">{lang="delete"}</a></li>
{{endif}}
{{endif}}
</ul>
</div>
</i-dropdown>
{{if $review->author()->member_id}}
<!-- Expand mini profile -->
<button class='ipsEntry__topButton ipsEntry__topButton--profile' type='button' aria-controls='mini-profile-review-{$review->id}' aria-expanded='false' data-ipscontrols data-ipscontrols-src="{$review->authorMiniProfileUrl}" aria-label="Toggle mini profile"><i class="fa-solid fa-chevron-down" aria-hidden="true"></i></button>
@@ -1201,20 +1220,24 @@ data-view-tracking-data="{expression="base64_encode(json_encode( $review->getVie
<div class='i-flex i-align-items_center i-justify-content_space-between i-margin-bottom_2'>
<h4 class='ipsTitle ipsTitle--h5'>{lang="review_response_title"}</h4>
{{if $review->canEditResponse() OR $review->canDeleteResponse()}}
<a href='#elControlsReviews_{$review->id}_response_menu' class='ipsEntry__topButton ipsEntry__topButton--ellipsis' id='elControlsReviews_{$review->id}_response' title='{lang="more_options"}' data-ipsMenu data-ipsMenu-appendTo='#review-{$review->id}_wrap'><i class='fa-solid fa-ellipsis'></i></a>
<button type="button" id='elControlsReviews_{$review->id}_response' popovertarget='elControlsReviews_{$review->id}_response_menu' class='ipsEntry__topButton ipsEntry__topButton--ellipsis' title='{lang="more_options"}'><i class='fa-solid fa-ellipsis'></i></button>
{{endif}}
</div>
<div data-role="reviewResponse" class="ipsRichText" data-controller='core.front.core.lightboxedImages'>{$review->mapped('author_response')|raw}</div>
{{if $review->canEditResponse() OR $review->canDeleteResponse()}}
<ul class='ipsMenu ipsMenu_narrow ipsHide' id='elControlsReviews_{$review->id}_response_menu'>
{{if $review->canEditResponse()}}
<li class='ipsMenu_item'><a href='{$review->url('editResponse')}' data-ipsDialog data-ipsDialog-title='{lang="review_author_respond"}'>{lang="edit"}</a></li>
{{endif}}
{{if $review->canDeleteResponse()}}
<li class='ipsMenu_item'><a href='{$review->url('deleteResponse')->csrf()}' data-confirm>{lang="delete"}</a></li>
{{endif}}
</ul>
<i-dropdown id="elControlsReviews_{$review->id}_response_menu" popover>
<div class="iDropdown">
<ul class="iDropdown__items">
{{if $review->canEditResponse()}}
<li><a href='{$review->url('editResponse')}' data-ipsDialog data-ipsDialog-title='{lang="review_author_respond"}'>{lang="edit"}</a></li>
{{endif}}
{{if $review->canDeleteResponse()}}
<li><a href='{$review->url('deleteResponse')->csrf()}' data-confirm>{lang="delete"}</a></li>
{{endif}}
</ul>
</div>
</i-dropdown>
{{endif}}
</div>
{{endif}}
@@ -1245,19 +1268,23 @@ data-view-tracking-data="{expression="base64_encode(json_encode( $review->getVie
{{endif}}
{{if $review->canEdit() || $review->canSplit()}}
<li>
<a href='#elControlsReviewsSub_{$review->id}_menu' id='elControlsReviewsSub_{$review->id}' data-ipsMenu data-ipsMenu-appendTo='#review-{$review->id}_wrap'><span>{lang="options"}</span><i class='fa-solid fa-caret-down'></i></a>
<ul id='elControlsReviewsSub_{$review->id}_menu' class='ipsMenu ipsMenu_narrow ipsHide'>
{{if $review->canEdit()}}
{{if $review->mapped('first') and $review->item()->canEdit()}}
<li class='ipsMenu_item'><a href='{$review->item()->url()->setQueryString( 'do', 'edit' )}'>{lang="edit"}</a></li>
{{else}}
<li class='ipsMenu_item'><a href='{$review->url('edit')}' data-action='editComment'>{lang="edit"}</a></li>
{{endif}}
{{endif}}
{{if $review->canSplit()}}
<li class='ipsMenu_item'><a href='{$review->url('split')}' data-action='splitComment' data-ipsDialog data-ipsDialog-title="{lang="split_to_new" sprintf="\IPS\Member::loggedIn()->language()->addToStack( $item::$title )"}">{lang="split"}</a></li>
{{endif}}
</ul>
<button type="button" id="elControlsReviewsSub_{$review->id}" popovertarget="elControlsReviewsSub_{$review->id}_menu"><span>{lang="options"}</span><i class='fa-solid fa-caret-down'></i></button>
<i-dropdown popover id="elControlsReviewsSub_{$review->id}_menu">
<div class="iDropdown">
<ul class="iDropdown__items">
{{if $review->canEdit()}}
{{if $review->mapped('first') and $review->item()->canEdit()}}
<li><a href='{$review->item()->url()->setQueryString( 'do', 'edit' )}'>{lang="edit"}</a></li>
{{else}}
<li><a href='{$review->url('edit')}' data-action='editComment'>{lang="edit"}</a></li>
{{endif}}
{{endif}}
{{if $review->canSplit()}}
<li><a href='{$review->url('split')}' data-action='splitComment' data-ipsDialog data-ipsDialog-title="{lang="split_to_new" sprintf="\IPS\Member::loggedIn()->language()->addToStack( $item::$title )"}">{lang="split"}</a></li>
{{endif}}
</ul>
</div>
</i-dropdown>
</li>
{{endif}}
{{elseif $review->hidden() !== 1 && $review->canRespond()}}
@@ -1291,30 +1318,30 @@ data-view-tracking-data="{expression="base64_encode(json_encode( $review->getVie
</article>
{{endif}}]]></template>
<template template_key="database_display_reviews" template_title="reviews" template_desc="" template_location="database" template_group="display" template_params="$record" template_app="" template_type="template"><![CDATA[<div data-controller='core.front.core.commentFeed' {{if settings.auto_polling_enabled}}data-autoPoll{{endif}} data-commentsType='reviews' data-baseURL='{$record->url()}' {{if $record->isLastPage('reviews')}}data-lastPage{{endif}} data-feedID='{$record->reviewFeedId}' id='reviews' data-follow-area-id="records{$record::$customDatabaseId}-{$record->primary_id_field}">
{{if $record->reviewForm()}}
<div class="ipsComposeAreaWrapper">
<div class="ipsComposeAreaWrapper">
{{if $record->reviewForm()}}
{{if $record->locked()}}
<strong class='i-color_warning'><i class='fa-solid fa-circle-info'></i> {lang="item_locked_can_review"}</strong>
{{endif}}
<div id='elRecordReviewForm'>
{$record->reviewForm()|raw}
</div>
</div>
{{else}}
{{if $record->hasReviewed()}}
<!-- Already reviewed -->
{{elseif $record->locked()}}
{template="commentUnavailable" group="forms" location="front" app="core" params="'item_locked_cannot_review'"}
{{elseif \IPS\Member::loggedin()->restrict_post}}
{{if \IPS\Member::loggedIn()->restrict_post == -1}}
{template="reviewUnavailable" group="forms" location="front" app="core" params="'restricted_cannot_comment'"}
{{else}}
{template="reviewUnavailable" group="forms" location="front" app="core" params="'restricted_cannot_comment', \IPS\Member::loggedIn()->warnings(5,NULL,'rpa'), \IPS\Member::loggedIn()->restrict_post"}
{{else}}
{{if $record->hasReviewed()}}
<!-- Already reviewed -->
{{elseif $record->locked()}}
{template="commentUnavailable" group="forms" location="front" app="core" params="'item_locked_cannot_review'"}
{{elseif \IPS\Member::loggedin()->restrict_post}}
{{if \IPS\Member::loggedIn()->restrict_post == -1}}
{template="reviewUnavailable" group="forms" location="front" app="core" params="'restricted_cannot_comment'"}
{{else}}
{template="reviewUnavailable" group="forms" location="front" app="core" params="'restricted_cannot_comment', \IPS\Member::loggedIn()->warnings(5,NULL,'rpa'), \IPS\Member::loggedIn()->restrict_post"}
{{endif}}
{{elseif \IPS\Member::loggedIn()->members_bitoptions['unacknowledged_warnings']}}
{template="reviewUnavailable" group="forms" location="front" app="core" params="'unacknowledged_warning_cannot_post', \IPS\Member::loggedIn()->warnings( 1, FALSE )"}
{{endif}}
{{elseif \IPS\Member::loggedIn()->members_bitoptions['unacknowledged_warnings']}}
{template="reviewUnavailable" group="forms" location="front" app="core" params="'unacknowledged_warning_cannot_post', \IPS\Member::loggedIn()->warnings( 1, FALSE )"}
{{endif}}
{{endif}}
</div>
{{if \count( $record->reviews( NULL, NULL, 'date', 'desc', NULL, NULL, NULL, NULL, isset( \IPS\Request::i()->showDeleted ) ) )}}
<div class="ipsButtonBar ipsButtonBar--top">
{{if $record->reviewPageCount() > 1}}
@@ -1382,13 +1409,12 @@ data-view-tracking-data="{expression="base64_encode(json_encode( $review->getVie
<input type="hidden" name="plupload" value="{expression="md5( mt_rand() )"}">
<input type="hidden" name="content_record_form_container" value="{$category->_id}">
{{endif}}
<div class='ipsBox ipsPull'>
{{if !empty( $errorTabs )}}
<p class="ipsMessage ipsMessage--error ipsJS_show">{lang="tab_error"}</p>
{{endif}}
<div class='ipsBox ipsBox--cmsRecordForm ipsPull'>
<h2 class='ipsBox__header'>{lang="record_information" sprintf="$database->recordWord(1, TRUE)"}</h2>
{{if is_countable( $elements) AND \count( $elements ) > 1}}
{{if !empty( $errorTabs )}}
<p class="ipsMessage ipsMessage--error ipsJS_show">{lang="tab_error"}</p>
{{endif}}
<i-tabs class='ipsTabs' id='ipsTabs_{$id}' data-ipsTabBar data-ipsTabBar-contentArea='#ipsTabs_{$id}_content'>
<div role='tablist'>
{{$checkedTab = NULL;}}
@@ -1529,13 +1555,12 @@ data-view-tracking-data="{expression="base64_encode(json_encode( $review->getVie
<input type="hidden" name="plupload" value="{expression="md5( mt_rand() )"}">
<input type="hidden" name="content_record_form_container" value="{$category->_id}">
{{endif}}
<div class='ipsBox'>
{{if !empty( $errorTabs )}}
<p class="ipsMessage ipsMessage--error ipsJS_show">{lang="tab_error"}</p>
{{endif}}
<div class='ipsBox ipsBox--cmsTopicCopy'>
<h2 class='ipsBox__header'>{lang="record_information" sprintf="$database->recordWord(1, TRUE)"}</h2>
{{if \count( $elements ) > 1}}
{{if !empty( $errorTabs )}}
<p class="ipsMessage ipsMessage--error ipsJS_show">{lang="tab_error"}</p>
{{endif}}
<i-tabs class='ipsTabs' id='ipsTabs_{$id}' data-ipsTabBar data-ipsTabBar-contentArea='#ipsTabs_{$id}_content'>
<div role='tablist'>
{{$checkedTab = NULL;}}
@@ -1707,7 +1732,7 @@ data-view-tracking-data="{expression="base64_encode(json_encode( $review->getVie
{{endif}}
{{if $category->hasChildren() AND ! isset( \IPS\Request::i()->advancedSearchForm )}}
<div class="ipsBox ipsPull i-margin-bottom_3">
<div class="ipsBox ipsBox--cmsSubCategories ipsPull i-margin-bottom_3">
<h2 class='ipsBox__header'>{lang="content_subcategories_title"}</h2>
<i-data>
<ol class="ipsData {{if $category::database()->display_settings['categories']['layout'] != 'custom'}}ipsData--{$category::database()->display_settings['categories']['layout']}{{else}}ipsData--table{{endif}} ipsData--category ipsData--database-listing">
@@ -1737,7 +1762,7 @@ data-view-tracking-data="{expression="base64_encode(json_encode( $review->getVie
{{if \count( $activeFilters ) AND ! isset( \IPS\Request::i()->advancedSearchForm )}}
{template="filterMessage" group="listing" location="database" app="cms" params="$activeFilters, $category"}
{{endif}}]]></template>
<template template_key="database_listing_categoryTable" template_title="categoryTable" template_desc="" template_location="database" template_group="listing" template_params="$table, $headers, $rows, $quickSearch" template_app="" template_type="template"><![CDATA[<div class='ipsBox ipsPull' data-baseurl='{$table->baseUrl}' data-resort='{$table->resortKey}' data-controller='core.global.core.table{{if $table->canModerate()}},core.front.core.moderation{{endif}}'>
<template template_key="database_listing_categoryTable" template_title="categoryTable" template_desc="" template_location="database" template_group="listing" template_params="$table, $headers, $rows, $quickSearch" template_app="" template_type="template"><![CDATA[<div class='ipsBox ipsBox--cmsCategoryTable ipsPull' data-baseurl='{$table->baseUrl}' data-resort='{$table->resortKey}' data-controller='core.global.core.table{{if $table->canModerate()}},core.front.core.moderation{{endif}}'>
{{if isset( $table->extra['db'] )}}
<h2 class='ipsBox__header'>
@@ -1760,54 +1785,68 @@ data-view-tracking-data="{expression="base64_encode(json_encode( $review->getVie
<ul class='ipsDataFilters'>
{{if isset( $table->sortOptions ) and !empty( $table->sortOptions )}}
<li>
<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">{lang="sort_by"} <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>
<button type="button" id="elSortByMenu_{$table->uniqueId}" popovertarget="elSortByMenu_{$table->uniqueId}_menu" class='ipsDataFilters__button' data-role='sortButton'>{lang="sort_by"} <i class="fa-solid fa-caret-down"></i></button>
<i-dropdown popover id="elSortByMenu_{$table->uniqueId}_menu" data-i-dropdown-selectable="radio">
<div class="iDropdown">
<ul class="iDropdown__items">
{{$custom = TRUE;}}
{{foreach $table->sortOptions as $k => $col}}
<li><a href="{$table->baseUrl->setQueryString( array( 'filter' => $table->filter, 'sortby' => $col, 'sortdirection' => $table->getSortDirection( $col ) ) )->setPage('page',1)}" rel="nofollow" {{if $col === $table->getSortByColumn()}}{{$custom = FALSE;}}aria-selected="true"{{endif}} data-ipsMenuValue="{$col}" data-sortDirection='{$table->getSortDirection( $col )}'><i class="iDropdown__input"></i>{lang="{$table->langPrefix}sort_{$k}"}</a></li>
{{endforeach}}
{{if $table->advancedSearch}}
<li><hr></li>
<li>
<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"}' {{if $custom}}aria-selected="true"{{endif}}><i class="fa-solid fa-sliders"></i>{lang="custom"}</a>
</li>
{{endif}}
</ul>
</div>
</i-dropdown>
</li>
{{endif}}
{{if !empty( $table->filters )}}
<li>
<a href="#elFilterByMenu_menu" class='ipsDataFilters__button' data-role="tableFilterMenu" id="elFilterByMenu_{$table->uniqueId}" data-ipsMenu data-ipsMenu-activeClass="ipsDataFilters__button--active" data-ipsMenu-selectable="radio">{lang="filter_by"} <i class="fa-solid fa-caret-down"></i></a>
<ul class='ipsMenu ipsMenu_auto ipsMenu_withStem ipsMenu_selectable ipsHide' 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>
<button type="button" id="elFilterByMenu_{$table->uniqueId}" popovertarget="elFilterByMenu_{$table->uniqueId}_menu" class='ipsDataFilters__button' data-role="tableFilterMenu">{lang="filter_by"} <i class="fa-solid fa-caret-down"></i></button>
<i-dropdown popover id="elFilterByMenu_{$table->uniqueId}_menu" data-i-dropdown-selectable="radio">
<div class="iDropdown">
<ul class="iDropdown__items">
<li>
<a href='{$table->baseUrl->setQueryString( array( 'filter' => '', 'sortby' => $table->sortBy, 'sortdirection' => $table->sortDirection ) )->setPage('page',1)}' rel="nofollow" data-action="tableFilter" data-ipsMenuValue='' {{if !$table->filter}}aria-selected="true"{{endif}}><i class="iDropdown__input"></i>{lang="{$table->langPrefix}all"}</a>
</li>
<li><hr></li>
{{foreach $table->filters as $k => $q}}
<li>
<a href='{$table->baseUrl->setQueryString( array( 'filter' => $k, 'sortby' => $table->sortBy, 'sortdirection' => $table->sortDirection ) )->setPage('page',1)}' rel="nofollow" data-action="tableFilter" data-ipsMenuValue='{$k}' {{if $k === $table->filter}}aria-selected="true"{{endif}}><i class="iDropdown__input"></i>{lang="{$table->langPrefix}{$k}"}</a>
</li>
{{endforeach}}
</ul>
</div>
</i-dropdown>
</li>
{{endif}}
{{if $table->canModerate()}}
<li>
<a class="ipsDataFilters__button ipsJS_show" 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">
<button type="button" id="elCheck_{$table->uniqueId}" popovertarget="elCheck_{$table->uniqueId}_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}">
<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>
<li class="ipsMenu_sep"><hr></li>
<li class="ipsMenu_item" data-ipsMenuValue="read"><a href="#">{lang="read"}</a></li>
<li class="ipsMenu_item" data-ipsMenuValue="unread"><a href="#">{lang="unread"}</a></li>
<li class="ipsMenu_item" data-ipsMenuValue="hidden"><a href="#">{lang="hidden"}</a></li>
<li class="ipsMenu_item" data-ipsMenuValue="unapproved"><a href="#">{lang="unapproved"}</a></li>
<li class="ipsMenu_item" data-ipsMenuValue="locked"><a href="#">{lang="locked"}</a></li>
<li class="ipsMenu_item" data-ipsMenuValue="pinned"><a href="#">{lang="pinned"}</a></li>
<li class="ipsMenu_item" data-ipsMenuValue="featured"><a href="#">{lang="featured"}</a></li>
</ul>
</button>
<i-dropdown popover id="elCheck_{$table->uniqueId}_menu" data-i-dropdown-selectable="radio">
<div class="iDropdown">
<ul class="iDropdown__items">
<li class="iDropdown__title">{lang="{$table->langPrefix}select_rows"}</li>
<li><button type="button" data-ipsMenuValue="all"><i class="iDropdown__input"></i>{lang="all"}</button></li>
<li><button type="button" data-ipsMenuValue="none"><i class="iDropdown__input"></i>{lang="none"}</button></li>
<li><hr></li>
<li><button type="button" data-ipsMenuValue="read"><i class="iDropdown__input"></i>{lang="read"}</button></li>
<li><button type="button" data-ipsMenuValue="unread"><i class="iDropdown__input"></i>{lang="unread"}</button></li>
<li><button type="button" data-ipsMenuValue="hidden"><i class="iDropdown__input"></i>{lang="hidden"}</button></li>
<li><button type="button" data-ipsMenuValue="unapproved"><i class="iDropdown__input"></i>{lang="unapproved"}</button></li>
<li><button type="button" data-ipsMenuValue="locked"><i class="iDropdown__input"></i>{lang="locked"}</button></li>
<li><button type="button" data-ipsMenuValue="pinned"><i class="iDropdown__input"></i>{lang="pinned"}</button></li>
<li><button type="button" data-ipsMenuValue="featured"><i class="iDropdown__input"></i>{lang="featured"}</button></li>
</ul>
</div>
</i-dropdown>
</li>
{{endif}}
</ul>
@@ -1927,13 +1966,13 @@ data-view-tracking-data="{expression="base64_encode(json_encode( $review->getVie
<li class="ipsData__item {{if method_exists( $row, 'tableClass' ) && $row->tableClass()}}ipsData__item--{$row->tableClass()}{{endif}} {{if $row->hidden()}}ipsModerated{{endif}} {{if $row->isAssignedToMember()}}ipsData__item--assigned{{endif}}" data-rowID='{$row->$idField}' {{if $table !== null and $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->_title or $row->_title == 0}}{$row->_title}{{else}}{lang="content_deleted"}{{endif}}</span></a>
{{if $row->showRecordImage()}}
<figure class="ipsData__image">
<div class="ipsData__image" aria-hidden="true">
{{if $row->record_image}}
<img src="{file="$row->record_image" extension="cms_Records"}" loading="lazy" alt="">
{{else}}
<i></i>
{{endif}}
</figure>
</div>
{{endif}}
<div class='ipsData__content'>
<div class='ipsData__main'>