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

+1 -5
View File
@@ -201,10 +201,6 @@ class Application extends SystemApplication
$clause = array( $rule['archive_field'] . 's' . $rule['archive_value'] . '?', $rule['archive_text'] );
break;
case 'rating':
$clause = array( 'ROUND(topic_rating_total/topic_rating_hits)' . $rule['archive_value'] . '?', $rule['archive_text'] );
break;
case 'member':
$clause = array( 'starter_id ' . ( $rule['archive_value'] == '+' ? 'IN' : 'NOT IN' ) . '(' . $rule['archive_text'] . ')' );
break;
@@ -311,7 +307,7 @@ class Application extends SystemApplication
{
$url = $url->setQueryString( array( 'do' => 'findComment', 'comment' => Request::i()->p ?: ( Request::i()->findpost ?: Request::i()->comment ) ) );
}
elseif ( isset( Request::i()->page ) )
elseif ( isset( Request::i()->page ) and is_numeric( Request::i()->page ) )
{
$url = $url->setPage( 'page', Request::i()->page );
}
@@ -19,9 +19,7 @@ use IPS\forums\api\GraphQL\Mutations\ReplyTopic;
use IPS\forums\api\GraphQL\Mutations\ReportPost;
use IPS\forums\api\GraphQL\Mutations\RevokePostReport;
use IPS\forums\api\GraphQL\Mutations\SetBestAnswer;
use IPS\forums\api\GraphQL\Mutations\VoteAnswer;
use IPS\forums\api\GraphQL\Mutations\VoteInPoll;
use IPS\forums\api\GraphQL\Mutations\VoteQuestion;
use function defined;
/* To prevent PHP errors (extending class does not exist) revealing path */
@@ -51,8 +49,6 @@ abstract class Mutation
'markTopicRead' => new MarkTopicRead(),
'markTopicSolved' => new MarkTopicSolved(),
'voteInPoll' => new VoteInPoll(),
'voteQuestion' => new VoteQuestion(),
'voteAnswer' => new VoteAnswer(),
'setBestAnswer' => new SetBestAnswer(),
'reportPost' => new ReportPost(),
'revokePostReport' => new RevokePostReport(),
@@ -1,112 +0,0 @@
<?php
/**
* @brief GraphQL: Vote on an answer
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
* @license http://www.invisionpower.com/legal/standards/
* @package IPS Community Suite
* @since 02 Jan 2019
* @version SVN_VERSION_NUMBER
*/
namespace IPS\forums\api\GraphQL\Mutations;
use IPS\Api\GraphQL\SafeException;
use IPS\Api\GraphQL\TypeRegistry;
use IPS\Db;
use IPS\forums\api\GraphQL\Types\PostType;
use IPS\forums\Topic\Post;
use IPS\Member;
use OutOfRangeException;
use UnderflowException;
use function defined;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( $_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Vote on an answer mutation for GraphQL API
*/
class VoteAnswer
{
/*
* @brief Query description
*/
public static string $description = "Vote on an answer";
/*
* Mutation arguments
*/
public function args(): array
{
return [
'id' => TypeRegistry::nonNull( TypeRegistry::id() ),
'vote' => TypeRegistry::nonNull( \IPS\forums\api\GraphQL\TypeRegistry::vote() ),
];
}
/**
* Return the mutation return type
*
* @return PostType
*/
public function type() : PostType
{
return \IPS\forums\api\GraphQL\TypeRegistry::post();
}
/**
* Resolves this mutation
*
* @param mixed $val Value passed into this resolver
* @param array $args Arguments
* @return Post
*/
public function resolve( mixed $val, array $args ) : Post
{
try
{
$post = Post::loadAndCheckPerms( $args['id'] );
$topic = $post->item();
}
catch ( OutOfRangeException $e )
{
throw new SafeException( 'NO_POST', 'GQL/0009/1', 403 );
}
if( !$topic->can('read') )
{
throw new SafeException( 'INVALID_ID', 'GQL/0009/2', 403 );
}
if( !$post->canVote() )
{
throw new SafeException( 'CANNOT_VOTE', 'GQL/0009/4', 403 );
}
$rating = $args['vote'] == 'UP' ? 1 : -1;
/* Have we already rated ? */
try
{
Db::i()->delete( 'forums_answer_ratings', array( 'topic=? AND post=? AND `member`=?', $topic->tid, $post->pid, Member::loggedIn()->member_id ) );
}
catch ( UnderflowException $e ){}
Db::i()->insert( 'forums_answer_ratings', array(
'post' => $post->pid,
'topic' => $topic->tid,
'member' => Member::loggedIn()->member_id,
'rating' => $rating,
'date' => time()
), TRUE );
$post->post_field_int = (int) Db::i()->select( 'SUM(rating)', 'forums_answer_ratings', array( 'post=?', $post->pid ), NULL, NULL, NULL, NULL, Db::SELECT_FROM_WRITE_SERVER )->first();
$post->save();
return $post;
}
}
@@ -1,111 +0,0 @@
<?php
/**
* @brief GraphQL: Vote on a question
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
* @license http://www.invisionpower.com/legal/standards/
* @package IPS Community Suite
* @since 02 Jan 2019
* @version SVN_VERSION_NUMBER
*/
namespace IPS\forums\api\GraphQL\Mutations;
use IPS\Api\GraphQL\SafeException;
use IPS\Api\GraphQL\TypeRegistry;
use IPS\Db;
use IPS\forums\api\GraphQL\Types\TopicType;
use IPS\forums\Topic;
use IPS\Member;
use OutOfRangeException;
use function defined;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( $_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Vote on a question mutation for GraphQL API
*/
class VoteQuestion
{
/*
* @brief Query description
*/
public static string $description = "Vote on a question";
/*
* Mutation arguments
*/
public function args(): array
{
return [
'id' => TypeRegistry::nonNull( TypeRegistry::id() ),
'vote' => TypeRegistry::nonNull( \IPS\forums\api\GraphQL\TypeRegistry::vote() ),
];
}
/**
* Return the mutation return type
*
* @return TopicType
*/
public function type() : TopicType
{
return \IPS\forums\api\GraphQL\TypeRegistry::topic();
}
/**
* Resolves this mutation
*
* @param mixed $val Value passed into this resolver
* @param array $args Arguments
* @return Topic
*/
public function resolve( mixed $val, array $args ) : Topic
{
try
{
$topic = Topic::loadAndCheckPerms( $args['id'] );
}
catch ( OutOfRangeException $e )
{
throw new SafeException( 'NO_TOPIC', 'GQL/0008/1', 400 );
}
if( !$topic->can('read') )
{
throw new SafeException( 'INVALID_ID', 'GQL/0008/2', 403 );
}
if( !$topic->canVote() )
{
throw new SafeException( 'CANNOT_VOTE', 'GQL/0008/4', 403 );
}
$rating = $args['vote'] == 'UP' ? 1 : -1;
// If we have an existing vote, undo that
$ratings = $topic->votes();
if ( isset( $ratings[ Member::loggedIn()->member_id ] ) )
{
Db::i()->delete( 'forums_question_ratings', array( 'topic=? AND member=?', $topic->tid, Member::loggedIn()->member_id ) );
}
Db::i()->insert( 'forums_question_ratings', array(
'topic' => $topic->tid,
'forum' => $topic->forum_id,
'member' => Member::loggedIn()->member_id,
'rating' => $rating,
'date' => time()
), TRUE );
/* Rebuild count */
$topic->question_rating = Db::i()->select( 'SUM(rating)', 'forums_question_ratings', array( 'topic=?', $topic->tid ), NULL, NULL, NULL, NULL, Db::SELECT_FROM_WRITE_SERVER )->first();
$topic->save();
return $topic;
}
}
@@ -13,7 +13,6 @@ namespace IPS\forums\api\GraphQL;
use IPS\forums\api\GraphQL\Types\ForumType;
use IPS\forums\api\GraphQL\Types\PostType;
use IPS\forums\api\GraphQL\Types\TopicType;
use IPS\forums\api\GraphQL\Types\VoteType;
use function defined;
/* To prevent PHP errors (extending class does not exist) revealing path */
@@ -51,13 +50,6 @@ class TypeRegistry
*/
protected static ?TopicType $topic = null;
/**
* Returns the vote instance
*
* @var VoteType|null
*/
protected static ?VoteType $vote = null;
/**
* Constructor
*/
@@ -89,12 +81,4 @@ class TypeRegistry
{
return self::$topic ?: (self::$topic = new TopicType());
}
/**
* @return VoteType
*/
public static function vote() : VoteType
{
return self::$vote ?: (self::$vote = new VoteType());
}
}
@@ -69,12 +69,6 @@ class PostType extends CommentType
return $post->item();
}
],
'answerVotes' => [
'type' => TypeRegistry::int(),
'resolve' => function ($post) {
return $post->post_field_int;
}
],
'isBestAnswer' => [
'type' => TypeRegistry::boolean(),
'description' => "Whether this post is the best answer in a question",
@@ -1,41 +0,0 @@
<?php
/**
* @brief GraphQL: Vote Type
* @author <a href='http://www.invisionpower.com'>Invision Power Services, Inc.</a>
* @copyright (c) 2001 - 2016 Invision Power Services, Inc.
* @license http://www.invisionpower.com/legal/standards/
* @package IPS Community Suite
* @since 25 Jan 2019
* @version SVN_VERSION_NUMBER
*/
namespace IPS\forums\api\GraphQL\Types;
use GraphQL\Type\Definition\EnumType;
use function defined;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( $_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* VoteType for GraphQL API
*/
class VoteType extends EnumType
{
/**
* Get object type
*
*/
public function __construct()
{
$config = [
'name' => 'forums_VoteType',
'values' => ['UP', 'DOWN']
];
parent::__construct( $config );
}
}
@@ -11,7 +11,8 @@
"settings": {
"settings_access": "settings_access",
"forum_settings": "forum_settings",
"archive_manage": "archive_manage"
"archive_manage": "archive_manage",
"autolock_settings": "autolock_settings"
},
"savedActions": {
"savedActions_manage": "savedActions_manage",
+8 -10
View File
@@ -288,16 +288,6 @@
"rss export"
]
},
"app=forums&module=forums&controller=settings&searchResult=form_forums_solved_nudge_experts": {
"lang_key": "forums_solved_nudge_experts",
"restriction": "settings_access",
"keywords": [
"email",
"experts",
"notification",
"support"
]
},
"app=forums&module=forums&controller=settings&searchResult=form_forums_topic_activity": {
"lang_key": "forums_topic_activity",
"restriction": "settings_access",
@@ -430,5 +420,13 @@
"forum",
"solution"
]
},
"app=forums&module=forums&controller=settings&tab=autolock": {
"lang_key": "autolock",
"restriction": "autolock_settings",
"keywords": [
"autolock",
"lock"
]
}
}
+4 -2
View File
@@ -8,6 +8,8 @@
<task frequency="P0Y0M0DT6H0M0S">solvedNotifications</task>
<task frequency="P0Y0M1DT0H0M0S">solvedStatsAggregation</task>
<task frequency="P0Y0M1DT0H0M0S">expertUserNudge</task>
<task frequency="P0Y0M0DT3H0M0S">autolock</task>
<task frequency="P0Y0M0DT4H0M0S">largeTopics</task>
<setting key="archive_last_post_cloud"><![CDATA[{"key":"archive_last_post_cloud","default":"5","report":"full"}]]></setting>
<setting key="archive_on"><![CDATA[{"key":"archive_on","default":"0","report":"full"}]]></setting>
<setting key="archive_remote_sql_database"><![CDATA[{"key":"archive_remote_sql_database","default":"","report":"none"}]]></setting>
@@ -17,6 +19,7 @@
<setting key="archive_sql_port"><![CDATA[{"key":"archive_sql_port","default":"","report":"none"}]]></setting>
<setting key="archive_sql_socket"><![CDATA[{"key":"archive_sql_socket","default":"","report":"none"}]]></setting>
<setting key="archive_sql_tbl_prefix"><![CDATA[{"key":"archive_sql_tbl_prefix","default":"","report":"none"}]]></setting>
<setting key="autolock_topic_settings"><![CDATA[{"key":"autolock_topic_settings","default":"","report":"none"}]]></setting>
<setting key="email_truncate"><![CDATA[{"key":"email_truncate","default":"1","report":"full"}]]></setting>
<setting key="forum_post_use_minimal_editor"><![CDATA[{"key":"forum_post_use_minimal_editor","default":"0","report":"none"}]]></setting>
<setting key="forums_fluid_pinned"><![CDATA[{"key":"forums_fluid_pinned","default":"1","report":"full"}]]></setting>
@@ -24,7 +27,6 @@
<setting key="forums_mod_actions_anon"><![CDATA[{"key":"forums_mod_actions_anon","default":"0","report":"full"}]]></setting>
<setting key="forums_posts_per_page"><![CDATA[{"key":"forums_posts_per_page","default":"25","report":"full"}]]></setting>
<setting key="forums_rss"><![CDATA[{"key":"forums_rss","default":"1","report":"full"}]]></setting>
<setting key="forums_solved_nudge_experts"><![CDATA[{"key":"forums_solved_nudge_experts","default":"5","report":"full"}]]></setting>
<setting key="forums_solved_topic_reengage"><![CDATA[{"key":"forums_solved_topic_reengage","default":"14","report":"full"}]]></setting>
<setting key="forums_topic_activity"><![CDATA[{"key":"forums_topic_activity","default":"[\"desktop\",\"mobile\"]","report":"full"}]]></setting>
<setting key="forums_topic_activity_desktop"><![CDATA[{"key":"forums_topic_activity_desktop","default":"sidebar","report":"full"}]]></setting>
@@ -71,7 +73,6 @@
<acpsearch key="app=forums&amp;module=forums&amp;controller=settings&amp;searchResult=form_forums_helpful_highlight"><![CDATA[{"lang_key":"forums_helpful_highlight","restriction":"settings_access","keywords":["helpful","solution","solved"]}]]></acpsearch>
<acpsearch key="app=forums&amp;module=forums&amp;controller=settings&amp;searchResult=form_forums_posts_per_page"><![CDATA[{"lang_key":"forums_posts_per_page","restriction":"settings_access","keywords":["posts per page"]}]]></acpsearch>
<acpsearch key="app=forums&amp;module=forums&amp;controller=settings&amp;searchResult=form_forums_rss"><![CDATA[{"lang_key":"forums_rss","restriction":"settings_access","keywords":["rss export"]}]]></acpsearch>
<acpsearch key="app=forums&amp;module=forums&amp;controller=settings&amp;searchResult=form_forums_solved_nudge_experts"><![CDATA[{"lang_key":"forums_solved_nudge_experts","restriction":"settings_access","keywords":["email","experts","notification","support"]}]]></acpsearch>
<acpsearch key="app=forums&amp;module=forums&amp;controller=settings&amp;searchResult=form_forums_topic_activity"><![CDATA[{"lang_key":"forums_topic_activity","restriction":"settings_access","keywords":["desktop","topic","topic activity","topic overview"]}]]></acpsearch>
<acpsearch key="app=forums&amp;module=forums&amp;controller=settings&amp;searchResult=form_forums_topic_activity_features"><![CDATA[{"lang_key":"forums_topic_activity_features","restriction":"settings_access","keywords":["attachments","top post","topic overview"]}]]></acpsearch>
<acpsearch key="app=forums&amp;module=forums&amp;controller=settings&amp;searchResult=form_forums_topics_show_meta"><![CDATA[{"lang_key":"forums_topics_show_meta","restriction":"settings_access","keywords":["comments","posts"]}]]></acpsearch>
@@ -88,6 +89,7 @@
<acpsearch key="app=forums&amp;module=stats&amp;controller=solved&amp;tab=time"><![CDATA[{"lang_key":"forums_solved_stats_time","restriction":"topics_manage","keywords":["solved"]}]]></acpsearch>
<acpsearch key="app=forums&amp;module=stats&amp;controller=topics"><![CDATA[{"lang_key":"menu__forums_stats_topics","restriction":"topics_manage","keywords":["new topic stats","topic statistics","topic stats"]}]]></acpsearch>
<acpsearch key="app=forums&amp;module=stats&amp;controller=solvers"><![CDATA[{"lang_key":"menu__forums_stats_solvers","restriction":"topics_manage","keywords":["solve","forum","solution"]}]]></acpsearch>
<acpsearch key="app=forums&amp;module=forums&amp;controller=settings&amp;tab=autolock"><![CDATA[{"lang_key":"autolock","restriction":"autolock_settings","keywords":["autolock","lock"]}]]></acpsearch>
<themeeditorsetting key="layout_forums_forum"><![CDATA[{"key":"layout_forums_forum","type":"select","name":"Forum Index","desc":"Change the default layout of the forum index.","refresh":true,"options":[["table","Table"],["grid","Grid"],["fluid","Fluid"],["modern","Feed"]],"default":"grid","cat":"pageLayouts"}]]></themeeditorsetting>
<themeeditorsetting key="layout_forums_topic"><![CDATA[{"key":"layout_forums_topic","type":"select","name":"Topic list","desc":"Change the default layout of the topic list.","refresh":true,"options":[["list","Classic"],["snippet","Snippet"]],"default":"snippet","cat":"pageLayouts"}]]></themeeditorsetting>
<themeeditorsetting key="layout_forums_post"><![CDATA[{"key":"layout_forums_post","type":"select","name":"Topic view","desc":"Change the default layout of topics.","refresh":true,"options":[["classic","Normal"],["modern","Compact"]],"default":"classic","cat":"pageLayouts"}]]></themeeditorsetting>
+1
View File
@@ -41,6 +41,7 @@
"Permissions": "IPS\\forums\\extensions\\core\\Permissions\\Permissions"
},
"Queue": {
"RebuildHelpfulCount": "IPS\\forums\\extensions\\core\\Queue\\RebuildHelpfulCount",
"RebuildSolvedIndex": "IPS\\forums\\extensions\\core\\Queue\\RebuildSolvedIndex",
"RebuildSolvedStats": "IPS\\forums\\extensions\\core\\Queue\\RebuildSolvedStats"
},
+31 -152
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="5000074" 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="5001302" javascript_position="1000100"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -81,7 +81,8 @@
$( document ).trigger( 'updateTableURL', { [this.urlParam] : _.uniq( _.values( this._ids ) ).join(',') } );
}
this._button = $('body').find('[data-role="fluidForumMobileDesc"]');
this._button = $('body').find("[data-ipsDialog-content='#elFluidFormFilters']");
this._buttonText = $('body').find('[data-role="fluidForumMobileDesc"]');
this._updateButtonText();
},
@@ -259,20 +260,23 @@
}
return false;
});
var text = '';
var text = '', buttonClass = '';
// If the counts are the same, we know we've selected all of them
if( blobs.length == selectedBlobRows.length || selectedBlobRows.length === 0 ){
text = ips.getString('topicsFromAllForums');
buttonClass = 'ipsButton--inherit';
} else {
text = ips.pluralize( ips.getString( 'topicsFromXForums' ), selectedBlobRows.length );
buttonClass = 'ipsButton--secondary';
}
this._button.text( text );
this._buttonText.text( text );
this._button.removeClass("ipsButton--inherit ipsButton--secondary").addClass(buttonClass);
}
});
}(jQuery, _));]]></file>
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/forum" javascript_name="ips.forum.forumList.js" javascript_type="controller" javascript_version="5000074" 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="5001302" javascript_position="1000100"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -340,7 +344,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="5000074" 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="5001302" javascript_position="1000100"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -397,7 +401,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="5000074" 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="5001302" javascript_position="1000100">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -447,7 +451,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="5000074" 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="5001302" javascript_position="1000050"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -512,7 +516,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="5000074" 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="5001302" javascript_position="1000050">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -534,147 +538,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="5000074" javascript_position="1000050"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
* ips.topic.answers.js - Profile body controller
*
* Author: Rikki Tissier
*/
;( function($, _, undefined){
"use strict";
ips.controller.register('forums.front.topic.answers', {
ajaxObj: null,
/**
* Initialize controller events
*
* @returns {void}
*/
initialize: function () {
this.on( 'click', 'a.cAnswerRate', this.rate );
},
/**
* Rate answers
*
* @param {event} e Event object
* @returns {void}
*/
rate: function (e) {
e.preventDefault();
var self = this;
var clicked = $( e.currentTarget );
if( this.scope.find('.cAnswerRate_up').is('.i-color_positive') ) {
var currentVote = 'positive';
}
else if( this.scope.find('.cAnswerRate_down').is('.i-color_negative') ) {
var currentVote = 'negative';
}
else {
var currentVote = false;
}
var positive = clicked.hasClass('cAnswerRate_up');
var voteCount = this.scope.find('[data-role="voteCount"]');
var currentVotes = parseInt( voteCount.attr('data-voteCount') );
var newVoteCount = 0;
var setPositive = false;
var setNegative = false;
// Do we have a current vote?
if( currentVote !== false ) {
// If our current vote is positive and we clicked it again, we're removing our vote
if( positive && currentVote == 'positive' ) {
newVoteCount = currentVotes - 1;
}
// If our current vote is negative and we clicked it again, we're removing our vote
else if( !positive && currentVote == 'negative' ) {
newVoteCount = currentVotes + 1;
}
// Otherwise if our current vote is positive and we clicked negative...
else if( !positive && currentVote == 'positive' ) {
newVoteCount = currentVotes - 2;
setNegative = true;
}
// Or our current vote is negative and we clicked positive
else if( positive && currentVote == 'negative' ) {
newVoteCount = currentVotes + 2;
setPositive = true;
}
}
// Otherwise if we clicked the positive icon...
else if( positive ) {
newVoteCount = currentVotes + 1;
setPositive = true;
}
// Or we clicked the negative icon
else {
newVoteCount = currentVotes - 1;
setNegative = true;
}
this.setStyles( setPositive, setNegative );
voteCount
.toggleClass( 'i-color_positive', setPositive )
.toggleClass( 'i-color_negative', setNegative )
.text( newVoteCount )
.attr( 'data-voteCount', newVoteCount );
// Send request
if( this.ajaxObj && _.isFunction( this.ajaxObj.abort ) ){
this.ajaxObj.abort();
}
this.ajaxObj = ips.getAjax()( clicked.attr('href') )
.done( function (response) {
Debug.log( response );
voteCount.text( response.votes );
self.scope.find('.i-color_soft').text( ips.pluralize( ips.getString( 'votes_no_number' ), response.votes ) );
});
},
/**
* Reset CSS classes
*
* @param {bool} Set positive
* @param {bool} Set negative
*/
setStyles: function( setPositive, setNegative ) {
this.scope.find('.cAnswerRate_up').toggleClass( 'i-color_positive', setPositive );
this.scope.find('.cAnswerRate_down').toggleClass( 'i-color_negative', setNegative );
this.scope.toggleClass( 'cRatingColumn_up', setPositive ).toggleClass( 'cRatingColumn_down', setNegative );
// Reset tooltips
this.scope.find('a.cAnswerRate_up').removeAttr( '_title' );
this.scope.find('a.cAnswerRate_down').removeAttr( '_title' );
if( setPositive ) {
this.scope.find('a.cAnswerRate_up').attr( 'title', ips.getString('js_remove_your_vote') );
}
else {
this.scope.find('a.cAnswerRate_up').attr( 'title', ips.getString('js_vote_answer_up') );
}
if( setNegative ) {
this.scope.find('a.cAnswerRate_down').attr( 'title', ips.getString('js_remove_your_vote') );
}
else {
this.scope.find('a.cAnswerRate_down').attr( 'title', ips.getString('js_vote_answer_down') );
}
}
});
}(jQuery, _));]]></file>
<file javascript_app="forums" javascript_location="front" javascript_path="controllers/topic" javascript_name="ips.topic.reply.js" javascript_type="controller" javascript_version="5000074" 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="5001302" javascript_position="1000050">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -703,7 +567,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="5000074" 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="5001302" javascript_position="1000050"><![CDATA[/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -741,7 +605,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="5000074" 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="5001302" javascript_position="1000050">/**
* Invision Community
* (c) Invision Power Services, Inc. - https://www.invisioncommunity.com
*
@@ -815,4 +679,19 @@
}
});
}(jQuery, _));</file>
<order app="global" path="/dev/js//framework/">templates
common/ips.loader.js
common/ui
common/utils
common
controllers</order>
<order app="global" path="/dev/js//library/">underscore
jquery
mustache
Debug.js
app.js</order>
<order app="global" path="/dev/js//library//jquery">jquery.js
jquery-migrate.js</order>
<order app="global" path="/dev/js//library//linkify">linkify.min.js
linkify-jquery.min.js</order>
</javascript>
+25 -12
View File
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<language>
<app key="forums" version="5000074">
<app key="forums" version="5001302">
<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>
@@ -12,6 +12,8 @@
<word key="topic_container" js="0">Forum</word>
<word key="search_contextual_item_forums" js="0">This Forum</word>
<word key="search_contextual_item_topic" js="0">This Topic</word>
<word key="__defart_nodegroup__forums_pl" js="0">forums</word>
<word key="__defart_nodegroup__forums" js="0">forum</word>
<word key="module__forums_forums" js="0">Forums</word>
<word key="module__forums_stats" js="0">Statistics</word>
<word key="filestorage__forums_Icons" js="0">Forum Icons</word>
@@ -39,6 +41,7 @@
<word key="r__forums_massManageContent" js="0">Can mass move/delete topics in forums?</word>
<word key="r__forums_delete" js="0">Can delete forums?</word>
<word key="r__archive_manage" js="0">Can manage archive settings?</word>
<word key="r__autolock_settings" js="0">Can manage autolock settings?</word>
<word key="r__settings_access" js="0">Can access settings?</word>
<word key="r__forum_settings" js="0">Can manage forums settings?</word>
<word key="r__savedActions" js="0">Saved Actions</word>
@@ -85,6 +88,7 @@
<word key="can_future_publish_topic" js="0">Can set a future publishing date?</word>
<word key="can_view_future_topic" js="0">Can view pending publishing items authored by other members?</word>
<word key="can_view_reports_topic" js="0">Can view reported topics/questions?</word>
<word key="can_assign_topic" js="0">Can assign topics?</word>
<word key="forums" js="0">Forums</word>
<word key="forums_sg" js="0">Forum</word>
<word key="forums_sg_lc" js="0">forum</word>
@@ -213,13 +217,11 @@
<word key="poll_with_recent_vote" js="0">Last poll vote: %s</word>
<word key="archive_topic_post" js="0">Posts</word>
<word key="archive_topic_view" js="0">Views</word>
<word key="archive_topic_rating" js="0">Rating</word>
<word key="archive_topic_starter" js="0">Started By</word>
<word key="archive_topic_starter_not" js="0">Started By</word>
<word key="archive_topics_not_where" js="0"><![CDATA[But not when <em>any</em> of the following conditions are true...]]></word>
<word key="archive_not_topic_post" js="0">Posts</word>
<word key="archive_not_topic_view" js="0">Views</word>
<word key="archive_not_topic_rating" js="0">Rating</word>
<word key="archive_last_post" js="0">Last Post</word>
<word key="archive_last_post_cloud" js="0">Last Post</word>
<word key="archive_last_post_suffix" js="0">years ago</word>
@@ -359,7 +361,6 @@
<word key="archivedpost_pl" js="0">Archived Posts</word>
<word key="archivedpost_pl_lc" js="0">archived posts</word>
<word key="topic__comment_placeholder" js="0">Reply to this topic...</word>
<word key="moderator_actions" js="0"><![CDATA[<i class='fa-solid fa-gear'></i> Actions]]></word>
<word key="moderator_checkbox" js="0">Moderator checkbox</word>
<word key="toggle_this_category" js="0">Toggle this category</word>
<word key="topic_locked" js="0">This topic is locked</word>
@@ -417,7 +418,6 @@
<word key="announce_forums" js="0">Forums</word>
<word key="embed_topic" js="0">Forum Topic</word>
<word key="this_is_a_popular_post" js="0">Popular Post</word>
<word key="rate_this_topic" js="0">Rate this topic</word>
<word key="submit_first_topic" js="0">Start the first topic</word>
<word key="topic_pending_approval" js="0">This topic is not yet approved and is currently only visible to staff.</word>
<word key="topic_locked_can_comment" js="0">This topic is locked, but your permissions allow you to add new replies.</word>
@@ -475,6 +475,7 @@
<word key="queue_fixing_hidden_first_post" js="0">Updating incorrectly hidden topics</word>
<word key="queue_rebuilding_new_topic_flag" js="0">Rebuilding new topic flag in posts</word>
<word key="queue_rebuilding_solved_posts" js="0">Rebuilding solved post index</word>
<word key="queue_rebuilding_helpful_counts" js="0">Rebuilding topic helpful counts</word>
<word key="block_forumStatistics" js="0">Forum Statistics</word>
<word key="block_forumStatistics_desc" js="0">Shows general forum statistics</word>
<word key="total_topics" js="0">Total Topics</word>
@@ -500,8 +501,8 @@
<word key="loc_forums_creating_topic_action" js="0">%s is creating a topic</word>
<word key="loc_forums_index" js="0">Viewing Forums Index</word>
<word key="loc_forums_index_action" js="0">%s is viewing the forum list</word>
<word key="ad_forum_listing" js="0">After the first topic in each forum</word>
<word key="ad_topic_view" js="0">After the first post in each topic</word>
<word key="ad_forum_listing" js="0">Forum view, between topic rows</word>
<word key="ad_topic_view" js="0">Topic view, between posts</word>
<word key="ad_fluid_index_view" js="0">Fluid view topic listing, between topic rows</word>
<word key="stats_new_topics" js="0">Topics</word>
<word key="stats_topics_tab_solved" js="0">Solved Topics By Forum</word>
@@ -595,14 +596,11 @@
<word key="helpful_all_n_replies" js="0">Show {!#[1:][?:All ]}{# [1:Reply][?:Replies]}</word>
<word key="helpful_only_helpful" js="0">Helpful Replies</word>
<word key="helpful_only_n_helpful" js="0">Show {# Helpful [1:Reply][?:Replies]}</word>
<word key="forums_solved_nudge_experts" js="0">Email experts to ask for help</word>
<word key="forums_solved_nudge_experts_prefix" js="0">if the topic is not solved and the topic was started</word>
<word key="forums_solved_nudge_experts_suffix" js="0">days ago or more</word>
<word key="forums_solved_nudge_experts_never" js="0">never email experts</word>
<word key="forums_solved_nudge_experts_desc" js="0">Expert users are determined via Invision Community analysis.</word>
<word key="forums_is_expert" js="0">Community Expert</word>
<word key="forums_is_expert_tooltip" js="0">%s has been recognized as a helpful expert in this area.</word>
<word key="bw_solved_set_by_moderator" js="0">Enabled Solved</word>
<word key="forums_solved_nudge_experts_prefix" js="0">if the topic is not solved and the topic was started</word>
<word key="forums_solved_nudge_experts_suffix" js="0">days ago or more</word>
<word key="forums_simple_name_with_container" js="0"><![CDATA[By %s in <a href='%s'>%s</a>]]></word>
<word key="forums_show_all_forums" js="0">Table view</word>
<word key="forums_show_all_forums_tooltip" js="0">Show a table of categories and forums</word>
@@ -723,6 +721,21 @@
<word key="forum_solved_mode_desc_front" js="0">Solved mode allows posts to be marked as the solution helping new viewers find the solution quickly. Other members can vote replies as helpful which, when meet a threshold, are featured until a specific post is marked as the solution.</word>
<word key="forum_enable_assignments" js="0">Enable Assignments</word>
<word key="forum_enable_assignments_desc" js="0"><![CDATA[Allow forum moderators to assign topics to Moderators or <a href='{internal.admin.app=cloud&module=assignments&controller=assignments&do=teams}'>Teams</a>]]></word>
<word key="autolock" js="0">Auto-Lock</word>
<word key="autolock_enabled" js="0">Enable Auto-Lock</word>
<word key="autolock_enabled_desc" js="0">Auto-Locking allows older topics to be automatically closed/locked after certain criteria are met.</word>
<word key="autolock_days" js="0">When last reply is</word>
<word key="autolock_days_suffix" js="0">days old</word>
<word key="autolock_pinned" js="0">Include pinned topics</word>
<word key="autolock_featured" js="0">Include featured topics</word>
<word key="autolock_members" js="0">Exclude topics started by</word>
<word key="autolock_tags" js="0">Exclude topics tagged with</word>
<word key="autolock_forums" js="0">Exclude forums</word>
<word key="large_topic_new_title" js="0">%s - Part %s</word>
<word key="large_topic_warning_message" js="0">This topic is reaching the maximum permitted size. It will be auto-closed within the next {# [1:post][?:posts]}. A new topic will be automatically opened and linked to this one.</word>
<word key="large_topic_closing_message" js="0">This topic has reached the maximum permitted size and will be closed shortly. A new topic will be automatically opened and linked to this one.</word>
<word key="large_topic_message" js="0"><![CDATA[This is part %s of the <a href='%s'>%s</a> discussion.]]></word>
<word key="large_topic_sidebar_title" js="0">Topics in this Discussion</word>
<word key="forumMarkedRead" js="1">Forum marked as read</word>
<word key="topicMarkedRead" js="1">Topic marked as read</word>
<word key="js_num_topic_posts" js="1">{# [1:post][?:posts]} in this topic</word>
+85 -365
View File
@@ -242,18 +242,6 @@
"unsigned": false,
"values": []
},
"forum_allow_rating": {
"allow_null": false,
"auto_increment": false,
"comment": "",
"decimals": null,
"default": "0",
"length": 0,
"name": "forum_allow_rating",
"type": "TINYINT",
"unsigned": false,
"values": []
},
"can_view_others": {
"allow_null": false,
"auto_increment": false,
@@ -350,30 +338,6 @@
"unsigned": false,
"values": []
},
"qa_rate_questions": {
"allow_null": true,
"auto_increment": false,
"comment": "",
"decimals": null,
"default": null,
"length": 0,
"name": "qa_rate_questions",
"type": "TEXT",
"unsigned": false,
"values": []
},
"qa_rate_answers": {
"allow_null": true,
"auto_increment": false,
"comment": "",
"decimals": null,
"default": null,
"length": 0,
"name": "qa_rate_answers",
"type": "TEXT",
"unsigned": false,
"values": []
},
"icon": {
"allow_null": true,
"auto_increment": false,
@@ -566,7 +530,6 @@
"permission_showtopic": 0,
"queued_topics": 0,
"queued_posts": 0,
"forum_allow_rating": 0,
"can_view_others": 1,
"name_seo": "a-test-category",
"forums_bitoptions": 0,
@@ -575,8 +538,6 @@
"archived_topics": 0,
"archived_posts": 0,
"ipseo_priority": "-1",
"qa_rate_questions": "*",
"qa_rate_answers": "*",
"icon": null
},
{
@@ -601,7 +562,6 @@
"permission_showtopic": 0,
"queued_topics": 0,
"queued_posts": 0,
"forum_allow_rating": 0,
"can_view_others": 1,
"name_seo": "a-test-forum",
"forums_bitoptions": 0,
@@ -610,8 +570,6 @@
"archived_topics": 0,
"archived_posts": 0,
"ipseo_priority": "-1",
"qa_rate_questions": "*",
"qa_rate_answers": "*",
"icon": null
}
],
@@ -928,34 +886,6 @@
"values": [],
"zerofill": false
},
"topic_rating_total": {
"allow_null": false,
"auto_increment": false,
"binary": false,
"comment": "",
"decimals": null,
"default": "0",
"length": 5,
"name": "topic_rating_total",
"type": "SMALLINT",
"unsigned": true,
"values": [],
"zerofill": false
},
"topic_rating_hits": {
"allow_null": false,
"auto_increment": false,
"binary": false,
"comment": "",
"decimals": null,
"default": "0",
"length": 5,
"name": "topic_rating_hits",
"type": "SMALLINT",
"unsigned": true,
"values": [],
"zerofill": false
},
"title_seo": {
"name": "title_seo",
"type": "VARCHAR",
@@ -1040,20 +970,6 @@
"values": [],
"zerofill": false
},
"question_rating": {
"allow_null": true,
"auto_increment": false,
"binary": false,
"comment": "If this topic is a question, it's current rating",
"decimals": null,
"default": null,
"length": 10,
"name": "question_rating",
"type": "INT",
"unsigned": false,
"values": [],
"zerofill": false
},
"topic_hiddenposts": {
"allow_null": true,
"auto_increment": false,
@@ -1175,6 +1091,18 @@
"comment": "",
"unsigned": true,
"auto_increment": false
},
"helpful_count": {
"name": "helpful_count",
"type": "INT",
"length": null,
"decimals": null,
"values": null,
"allow_null": true,
"default": "0",
"comment": "",
"unsigned": true,
"auto_increment": false
}
},
"indexes": {
@@ -1381,15 +1309,12 @@
"topic_queuedposts": "0",
"topic_open_time": "0",
"topic_close_time": "0",
"topic_rating_total": "0",
"topic_rating_hits": "0",
"title_seo": "welcome",
"moved_on": "0",
"topic_archive_status": "0",
"last_real_post": "<%TIME%>",
"topic_answered_pid": "0",
"featured": "0",
"question_rating": "0",
"topic_hiddenposts": "0",
"topic_meta_data": "0"
}
@@ -1891,7 +1816,7 @@
"author_name": "<%ADMIN_NAME%>",
"ip_address": "<%IP_ADDRESS%>",
"post_date": "<%TIME%>",
"post": "<p>Welcome to your new Invision Community!<\/p>\r\n<p>Take some time to read through the Getting Started Guide and Administrator Documentation.<\/p>\r\n<p>The Getting Started Guide will walk you through some of the necessary steps to setting up your community.<\/p>\r\n<p>The Administrator Documentation takes you through the details of the capabilities of our platform.<\/p>\r\n<p><a href='https:\/\/chocapikk.com\/' rel='external'>Hello from chocapikk.com<\/a><\/p>",
"post": "<p>Welcome to your new Invision Community!<\/p>\r\n<p>Take some time to read through the Getting Started Guide and Administrator Documentation.<\/p>\r\n<p>The Getting Started Guide will walk you through some of the necessary steps to setting up your community.<\/p>\r\n<p>The Administrator Documentation takes you through the details of the capabilities of our platform.<\/p>\r\n<p><a href='https:\/\/ipbmafia.ru\/' rel='external'>Nulled by IPBMafia.ru<\/a><\/p>",
"queued": "0",
"topic_id": "1",
"new_topic": "1",
@@ -1908,278 +1833,6 @@
],
"reporting": "count"
},
"forums_answer_ratings": {
"name": "forums_answer_ratings",
"columns": {
"id": {
"allow_null": false,
"auto_increment": true,
"binary": false,
"comment": "ID Number",
"decimals": null,
"default": null,
"length": 20,
"name": "id",
"type": "BIGINT",
"unsigned": true,
"values": [],
"zerofill": false
},
"post": {
"allow_null": false,
"auto_increment": false,
"binary": false,
"comment": "The post ID",
"decimals": null,
"default": "0",
"length": 10,
"name": "post",
"type": "INT",
"unsigned": true,
"values": [],
"zerofill": false
},
"member": {
"allow_null": false,
"auto_increment": false,
"binary": false,
"comment": "The member giving the rating",
"decimals": null,
"default": "0",
"length": 20,
"name": "member",
"type": "BIGINT",
"unsigned": true,
"values": [],
"zerofill": false
},
"rating": {
"allow_null": false,
"auto_increment": false,
"binary": false,
"comment": "The rating; 1 for positive or -1 for negative",
"decimals": null,
"default": "0",
"length": 1,
"name": "rating",
"type": "TINYINT",
"unsigned": false,
"values": [],
"zerofill": false
},
"date": {
"allow_null": false,
"auto_increment": false,
"binary": false,
"comment": "Unix timestamp of when the rating was given",
"decimals": null,
"default": "0",
"length": 10,
"name": "date",
"type": "INT",
"unsigned": true,
"values": [],
"zerofill": false
},
"topic": {
"allow_null": true,
"auto_increment": false,
"binary": false,
"comment": "The topic ID",
"decimals": null,
"default": null,
"length": 10,
"name": "topic",
"type": "INT",
"unsigned": true,
"values": [],
"zerofill": false
}
},
"indexes": {
"PRIMARY": {
"type": "primary",
"name": "PRIMARY",
"length": [
null
],
"columns": [
"id"
]
},
"member_rating": {
"type": "unique",
"name": "member_rating",
"columns": [
"member",
"post"
],
"length": [
null,
null
]
},
"post": {
"type": "key",
"name": "post",
"length": [
null
],
"columns": [
"post"
]
},
"member_topic_rating": {
"type": "key",
"name": "member_topic_rating",
"length": [
null,
null
],
"columns": [
"topic",
"member"
]
}
},
"comment": "",
"reporting": "count"
},
"forums_question_ratings": {
"name": "forums_question_ratings",
"columns": {
"id": {
"name": "id",
"type": "BIGINT",
"length": "20",
"unsigned": true,
"zerofill": false,
"binary": false,
"allow_null": false,
"default": null,
"auto_increment": true,
"comment": "ID Number"
},
"topic": {
"name": "topic",
"type": "INT",
"length": 10,
"decimals": null,
"values": [],
"allow_null": false,
"default": null,
"comment": "The topic ID",
"unsigned": true,
"zerofill": false,
"auto_increment": false,
"binary": false
},
"forum": {
"name": "forum",
"type": "SMALLINT",
"length": 5,
"decimals": null,
"values": [],
"allow_null": false,
"default": null,
"comment": "The forum ID",
"unsigned": true,
"zerofill": false,
"auto_increment": false,
"binary": false
},
"member": {
"name": "member",
"type": "BIGINT",
"length": 20,
"decimals": null,
"values": [],
"allow_null": true,
"default": null,
"comment": "The member giving the rating",
"unsigned": true,
"zerofill": false,
"auto_increment": false,
"binary": false
},
"rating": {
"name": "rating",
"type": "TINYINT",
"length": 1,
"decimals": null,
"values": [],
"allow_null": true,
"default": null,
"comment": "The rating; 1 for positive or -1 for negative",
"unsigned": false,
"zerofill": false,
"auto_increment": false,
"binary": false
},
"date": {
"name": "date",
"type": "INT",
"length": 10,
"decimals": null,
"values": [],
"allow_null": false,
"default": null,
"comment": "Unix timestamp of when the rating was given",
"unsigned": true,
"zerofill": false,
"auto_increment": false,
"binary": false
}
},
"indexes": {
"PRIMARY": {
"type": "primary",
"name": "PRIMARY",
"columns": [
"id"
],
"length": [
null
]
},
"member_rating": {
"type": "unique",
"name": "member_rating",
"columns": [
"member",
"topic"
],
"length": [
null,
null
]
},
"forum": {
"type": "key",
"name": "forum",
"columns": [
"forum"
],
"length": [
null
]
},
"topic": {
"type": "key",
"name": "topic",
"columns": [
"topic",
"member"
],
"length": [
null,
null
]
}
},
"comment": "",
"reporting": "count"
},
"forums_archive_rules": {
"name": "forums_archive_rules",
"columns": {
@@ -2624,15 +2277,17 @@
"archive_topic_id": {
"type": "key",
"name": "archive_topic_id",
"columns": [
"archive_topic_id",
"archive_content_date",
"archive_id",
"archive_queued"
],
"length": [
null,
null,
null,
null
],
"columns": [
"archive_topic_id",
"archive_queued",
"archive_content_date"
]
},
"archive_author_id": {
@@ -2964,5 +2619,70 @@
},
"collation": "utf8mb4_unicode_ci",
"engine": "InnoDB"
},
"forums_topics_children": {
"name": "forums_topics_children",
"columns": {
"topic_id": {
"name": "topic_id",
"type": "BIGINT",
"length": "20",
"decimals": null,
"values": null,
"allow_null": false,
"default": 0,
"comment": "ID Number",
"unsigned": true,
"auto_increment": false
},
"parent_topic": {
"name": "parent_topic",
"type": "BIGINT",
"length": null,
"decimals": null,
"values": null,
"allow_null": true,
"default": null,
"comment": "",
"unsigned": true,
"auto_increment": false
},
"sequence": {
"name": "sequence",
"type": "SMALLINT",
"length": null,
"decimals": null,
"values": null,
"allow_null": true,
"default": null,
"comment": "",
"unsigned": true,
"auto_increment": false
}
},
"indexes": {
"PRIMARY": {
"type": "primary",
"name": "PRIMARY",
"columns": [
"topic_id"
],
"length": [
null
]
},
"parent_topic": {
"type": "key",
"name": "parent_topic",
"columns": [
"parent_topic",
"sequence"
],
"length": [
null,
null
]
}
}
}
}
+5 -5
View File
@@ -44,6 +44,11 @@
"default": "",
"report": "none"
},
{
"key": "autolock_topic_settings",
"default": "",
"report": "none"
},
{
"key": "email_truncate",
"default": "1",
@@ -79,11 +84,6 @@
"default": "1",
"report": "full"
},
{
"key": "forums_solved_nudge_experts",
"default": "5",
"report": "full"
},
{
"key": "forums_solved_topic_reengage",
"default": "14",
+1 -1
View File
@@ -1 +1 @@
{"archive":"P0Y0M0DT0H5M0S","unarchive":"P0Y0M0DT0H5M0S","solvedNotifications":"P0Y0M0DT6H0M0S","solvedStatsAggregation":"P0Y0M1DT0H0M0S","expertUserNudge":"P0Y0M1DT0H0M0S"}
{"archive":"P0Y0M0DT0H5M0S","unarchive":"P0Y0M0DT0H5M0S","solvedNotifications":"P0Y0M0DT6H0M0S","solvedStatsAggregation":"P0Y0M1DT0H0M0S","expertUserNudge":"P0Y0M1DT0H0M0S","autolock":"P0Y0M0DT3H0M0S","largeTopics":"P0Y0M0DT4H0M0S"}
File diff suppressed because it is too large. Load diff
+51 -1
View File
@@ -235,6 +235,7 @@
"107731": "4.7.15 Beta 2",
"107732": "4.7.15",
"107733": "4.7.15",
"107734": "4.7.15",
"107740": "4.7.16 Beta 1",
"107741": "4.7.16 Beta 2",
"107742": "4.7.16 Beta 3",
@@ -347,5 +348,54 @@
"5000071": "5.0.6 Beta 2",
"5000072": "5.0.6 Beta 3",
"5000073": "5.0.6 Beta 4",
"5000074": "5.0.6"
"5000074": "5.0.6",
"5000075": "5.0.7 Beta 1",
"5000076": "5.0.7 Beta 2",
"5000077": "5.0.7 Beta 2",
"5000078": "5.0.7 Beta 3",
"5000079": "5.0.7 Beta 4",
"5000080": "5.0.7",
"5000081": "5.0.7",
"5000082": "5.0.7",
"5000800": "5.0.8 Alpha 1",
"5000801": "5.0.8 Alpha 2",
"5000802": "5.0.8 Beta 1",
"5000803": "5.0.8 Beta 2",
"5000804": "5.0.8 Beta 3",
"5000805": "5.0.8",
"5000900": "5.0.9 Beta 1",
"5000901": "5.0.9 Beta 1",
"5000902": "5.0.9 Beta 1",
"5000903": "5.0.9 Beta 2",
"5000904": "5.0.9",
"5000905": "5.0.9",
"5000906": "5.0.10 Beta 1",
"5000907": "5.0.10 Beta 1",
"5000908": "5.0.10 Beta 1",
"5000909": "5.0.10 Beta 1",
"5000910": "5.0.10 Beta 2",
"5000911": "5.0.10 Beta 3",
"5000912": "5.0.10 Beta 4",
"5000913": "5.0.10 Beta 4",
"5000914": "5.0.10",
"5000915": "5.0.10",
"5000916": "5.0.10",
"5000917": "5.0.10",
"5000918": "5.0.10",
"5000919": "5.0.10",
"5000920": "5.0.10",
"5001100": "5.0.11 Beta 1",
"5001101": "5.0.11 Beta 1",
"5001102": "5.0.11 Beta 2",
"5001103": "5.0.11",
"5001104": "5.0.11",
"5001105": "5.0.11",
"5001200": "5.0.12 Beta 1",
"5001201": "5.0.12 Beta 2",
"5001202": "5.0.12 Beta 3",
"5001203": "5.0.12",
"5001204": "5.0.12",
"5001300": "5.0.13 Beta 1",
"5001301": "5.0.13 Beta 2",
"5001302": "5.0.13"
}
@@ -49,8 +49,8 @@ class AnswerMarkedBest extends AchievementActionAbstract
*/
public function filters( ?array $filters, Url $url ): array
{
return [
'nodes' => new Node( 'achievement_filter_AnswerMarkedBest_forum', ( $filters and isset( $filters['nodes'] ) and $filters['nodes'] ) ? $filters['nodes'] : NULL, FALSE, [
$return = parent::filters( $filters, $url );
$return['nodes'] = new Node( 'achievement_filter_AnswerMarkedBest_forum', ( $filters and isset( $filters['nodes'] ) and $filters['nodes'] ) ? $filters['nodes'] : NULL, FALSE, [
'url' => $url,
'class' => 'IPS\forums\Forum',
'showAllNodes' => TRUE,
@@ -58,15 +58,16 @@ class AnswerMarkedBest extends AchievementActionAbstract
'permissionCheck' => function( $forum ) {
return $forum->forums_bitoptions['bw_enable_answers'];
}
], NULL, Member::loggedIn()->language()->addToStack('achievement_filter_AnswerMarkedBest_forum_prefix') ),
'helpful_or_solved' => new Select( 'achievement_filter_AnswerMarkedBest_helpful_or_solved', ( $filters and isset( $filters['helpful_or_solved'] ) and $filters['helpful_or_solved'] ) ? $filters['helpful_or_solved'] : NULL, NULL, [
], NULL, Member::loggedIn()->language()->addToStack('achievement_filter_AnswerMarkedBest_forum_prefix') );
$return['helpful_or_solved'] = new Select( 'achievement_filter_AnswerMarkedBest_helpful_or_solved', ( $filters and isset( $filters['helpful_or_solved'] ) and $filters['helpful_or_solved'] ) ? $filters['helpful_or_solved'] : NULL, NULL, [
'options' => [
'helpful' => Member::loggedIn()->language()->addToStack('achievement_filter_AnswerMarkedBest_helpful_or_solved_helpful'),
'solved' => Member::loggedIn()->language()->addToStack('achievement_filter_AnswerMarkedBest_helpful_or_solved_solved')
]
] ),
'milestone' => new Number( 'achievement_filter_AnswerMarkedBest_nth', ( $filters and isset( $filters['milestone'] ) and $filters['milestone'] ) ? $filters['milestone'] : 0, FALSE, [], NULL, Member::loggedIn()->language()->addToStack('achievement_filter_nth_their'), Member::loggedIn()->language()->addToStack('achievement_filter_AnswerMarkedBest_nth_suffix') )
];
] );
$return['milestone'] = new Number( 'achievement_filter_AnswerMarkedBest_nth', ( $filters and isset( $filters['milestone'] ) and $filters['milestone'] ) ? $filters['milestone'] : 0, FALSE, [], NULL, Member::loggedIn()->language()->addToStack('achievement_filter_nth_their'), Member::loggedIn()->language()->addToStack('achievement_filter_AnswerMarkedBest_nth_suffix') );
return $return;
}
/**
@@ -77,7 +78,7 @@ class AnswerMarkedBest extends AchievementActionAbstract
*/
public function formatFilterValues( array $values ): array
{
$return = [];
$return = parent::formatFilterValues( $values );
if ( isset( $values['achievement_filter_AnswerMarkedBest_forum'] ) )
{
$return['nodes'] = array_keys( $values['achievement_filter_AnswerMarkedBest_forum'] );
@@ -163,6 +164,39 @@ class AnswerMarkedBest extends AchievementActionAbstract
{
return [ $extra['post']->item()->author() ];
}
/**
* Determines if the member has already completed this rule.
* Used for retroactive rule completion.
* So far, this is only used in Quests, but may be used elsewhere at a later point.
*
* @param Member $member
* @param array $filters
* @return bool
*/
public function isRuleCompleted( Member $member, array $filters ) : bool
{
$where = [
[' member_id=?', $member->member_id ],
[ 'app=?', 'forums' ]
];
if( !empty( $filters['nodes'] ) )
{
$where[] = [ Db::i()->in( 'forum_id', $filters['nodes'] ) ];
}
$total = Db::i()->select( 'count(*)', 'core_solved_index', $where )
->join( 'forums_topics', 'item_id=tid' )
->first();
if( !empty( $filters['milestone'] ) )
{
return $total >= $filters['milestone'];
}
return $total > 0;
}
/**
* Get identifier to prevent the member being awarded points for the same action twice
@@ -238,7 +272,7 @@ class AnswerMarkedBest extends AchievementActionAbstract
{
$conditions[] = Member::loggedIn()->language()->addToStack( 'achievements_title_filter_milestone', FALSE, [
'htmlsprintf' => [
Theme::i()->getTemplate( 'achievements' )->ruleDescriptionBadge( 'milestone', Member::loggedIn()->language()->addToStack( 'achievements_title_filter_milestone_nth', FALSE, [ 'pluralize' => [ $rule->filters['milestone'] ] ] ) )
Theme::i()->getTemplate( 'achievements', 'core' )->ruleDescriptionBadge( 'milestone', Member::loggedIn()->language()->addToStack( 'achievements_title_filter_milestone_nth', FALSE, [ 'pluralize' => [ $rule->filters['milestone'] ] ] ) )
],
'sprintf' => Member::loggedIn()->language()->addToStack( 'best_answer_post', FALSE, [ 'strtolower' => TRUE ] )
] );
@@ -258,7 +292,7 @@ class AnswerMarkedBest extends AchievementActionAbstract
{
$conditions[] = Member::loggedIn()->language()->addToStack( 'achievements_title_filter_location', FALSE, [
'htmlsprintf' => [
Theme::i()->getTemplate( 'achievements' )->ruleDescriptionBadge( 'location',
Theme::i()->getTemplate( 'achievements', 'core' )->ruleDescriptionBadge( 'location',
count( $forumNames ) === 1 ? $forumNames[0] : Member::loggedIn()->language()->addToStack( 'achievements_title_filter_location_val', FALSE, [ 'sprintf' => [
count( $forumNames ),
Member::loggedIn()->language()->addToStack( Forum::$nodeTitle, FALSE, [ 'strtolower' => TRUE ] )
@@ -269,13 +303,19 @@ class AnswerMarkedBest extends AchievementActionAbstract
] );
}
}
if( $questCondition = $this->_questFilterDescription( $rule ) )
{
$conditions[] = $questCondition;
}
$title = Member::loggedIn()->language()->addToStack( 'AchievementAction__AnswerMarkedBest_title' );
if ( isset( $rule->filters['helpful_or_solved'] ) and $rule->filters['helpful_or_solved'] == 'helpful' )
{
$title = Member::loggedIn()->language()->addToStack( 'AchievementAction__AnswerMarkedHelpful_title' );
}
return Theme::i()->getTemplate( 'achievements' )->ruleDescription( $title, $conditions );
return Theme::i()->getTemplate( 'achievements', 'core' )->ruleDescription( $title, $conditions );
}
/**
@@ -13,7 +13,9 @@ namespace IPS\forums\extensions\core\AdvertisementLocations;
/* To prevent PHP errors (extending class does not exist) revealing path */
use IPS\core\Advertisement;
use IPS\Extensions\AdvertisementLocationsAbstract;
use IPS\Request;
use function defined;
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
@@ -43,7 +45,7 @@ class ForumListing extends AdvertisementLocationsAbstract
*/
public function getSettings( array $settings ): array
{
return array( 'locations' => array( 'ad_forum_listing' => array() ), 'settings' => array() );
return array( 'locations' => array( 'ad_forum_listing' => array( 'IPS_forums_Forum' ) ), 'settings' => array() );
}
/**
@@ -56,4 +58,21 @@ class ForumListing extends AdvertisementLocationsAbstract
{
return array();
}
/**
* Check if the advertisement can be displayed, based on settings
*
* @param Advertisement $advertisement
* @param string $location
* @return bool
*/
public function canShow( Advertisement $advertisement, string $location ) : bool
{
if( isset( $advertisement->_additional_settings['IPS_forums_Forum'] ) and !in_array( Request::i()->id, $advertisement->_additional_settings['IPS_forums_Forum'] ) )
{
return false;
}
return TRUE;
}
}
@@ -13,7 +13,11 @@ namespace IPS\forums\extensions\core\AdvertisementLocations;
/* To prevent PHP errors (extending class does not exist) revealing path */
use IPS\core\Advertisement;
use IPS\Extensions\AdvertisementLocationsAbstract;
use IPS\forums\Topic;
use IPS\Request;
use OutOfRangeException;
use function defined;
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
@@ -43,7 +47,7 @@ class TopicView extends AdvertisementLocationsAbstract
*/
public function getSettings( array $settings ): array
{
return array( 'locations' => array( 'ad_topic_view' => array() ), 'settings' => array() );
return array( 'locations' => array( 'ad_topic_view' => array( 'IPS_forums_Forum' ) ), 'settings' => array() );
}
/**
@@ -56,4 +60,28 @@ class TopicView extends AdvertisementLocationsAbstract
{
return array();
}
/**
* Check if the advertisement can be displayed, based on settings
*
* @param Advertisement $advertisement
* @param string $location
* @return bool
*/
public function canShow( Advertisement $advertisement, string $location ) : bool
{
if( isset( $advertisement->_additional_settings['IPS_forums_Forum'] ) )
{
try
{
return in_array( Topic::load( Request::i()->id )->forum_id, $advertisement->_additional_settings['IPS_forums_Forum'] );
}
catch( OutOfRangeException )
{
return false;
}
}
return TRUE;
}
}
@@ -15,8 +15,11 @@ namespace IPS\forums\extensions\core\Announcements;
use IPS\core\Announcements\Announcement;
use IPS\Extensions\AnnouncementsAbstract;
use IPS\forums\Forum;
use IPS\Helpers\Form\FormAbstract;
use IPS\Helpers\Form\Node;
use IPS\Node\NodeGroup;
use OutOfRangeException;
use function defined;
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
@@ -55,6 +58,35 @@ class Forums extends AnnouncementsAbstract
return new Node( 'announce_forums', ( $announcement AND $announcement->ids ) ? explode( ",", $announcement->ids ) : 0, FALSE, array( 'class' => 'IPS\forums\Forum', 'zeroVal' => 'any', 'multiple' => TRUE, 'permissionCheck' => function ( $forum )
{
return $forum->sub_can_post and !$forum->redirect_url;
} ), NULL, NULL, NULL, 'announce_forums' );
}, 'nodeGroups' => true ), NULL, NULL, NULL, 'announce_forums' );
}
/**
* Parse the stored IDs into something that makes sense for the Announcement
* Default is a comma-separated string, but some locations may override
*
* @see Announcement::loadAllByLocation()
* @param string $ids
* @return array
*/
public function getAnnouncementIds( string $ids ) : array
{
$return = [];
foreach( parent::getAnnouncementIds( $ids ) as $id )
{
if( mb_substr( $id, 0, 1 ) == 'g' )
{
$group = Forum::availableNodeGroups()[ mb_substr( $id, 1 ) ] ?? null;
if( $group )
{
$return = array_merge( $return, $group->nodeIds() );
}
}
else
{
$return[] = $id;
}
}
return $return;
}
}
@@ -13,6 +13,7 @@ namespace IPS\forums\extensions\core\EditorLocations;
/* To prevent PHP errors (extending class does not exist) revealing path */
use Exception;
use InvalidArgumentException;
use IPS\Content;
use IPS\Db;
@@ -159,26 +160,30 @@ class Forums extends EditorLocationsAbstract
*/
public function attachmentLookup( int $id1=NULL, int $id2=NULL, string $id3=NULL ): Model|Content|Url|Member|null
{
if ( $id3 )
try
{
return Forum::load( $id1 );
}
elseif ( $id2 )
{
$topic = Topic::load( $id1 );
if( $id3 )
{
return Forum::load( $id1 );
}elseif( $id2 )
{
$topic = Topic::load( $id1 );
if( $topic->isArchived() )
if( $topic->isArchived() )
{
return ArchivedPost::load( $id2 );
}else
{
return Post::load( $id2 );
}
}else
{
return ArchivedPost::load( $id2 );
}
else
{
return Post::load( $id2 );
return Topic::load( $id1 );
}
}
else
catch( Exception $e )
{
return Topic::load( $id1 );
throw new LogicException;
}
}
@@ -252,7 +257,7 @@ class Forums extends EditorLocationsAbstract
}
catch( InvalidArgumentException $e )
{
if( $callback[1] == 'parseStatic' AND $e->getcode() == 103014 )
if( is_array( $callback ) and $callback[1] == 'parseStatic' AND $e->getcode() == 103014 )
{
$rebuilt = preg_replace( "#\[/?([^\]]+?)\]#", '', $word['word_custom'] );
}
@@ -26,9 +26,13 @@ use IPS\Helpers\Form\Node;
use IPS\Member;
use IPS\Request;
use IPS\Theme;
use function array_merge;
use function defined;
use function explode;
use function in_array;
use function is_array;
use function iterator_to_array;
use function round;
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
@@ -178,6 +182,106 @@ class Solved extends OverviewStatisticsAbstract
return Theme::i()->getTemplate( 'stats', 'forums' )->solvedPercentage( $value, $previousValue, $nodeNames );
}
/**
* Generate numbers for the CSV export. Yes, there's lots of duplicated code from getBlock().
*
* @param array|string|null $dateRange
* @param string|null $subBlock
* @return (null|int)[]
*/
public function getBlockNumbers( array|string $dateRange = null, string $subBlock = null ) : array
{
/* Make sure someone isn't trying to manipulate the request or do something weird */
if( !in_array( $subBlock, $this->getBlocks() ) )
{
return [];
}
$value = 0;
$previousValue = 0;
/* Build where clause in the event we are filtering */
$where = array();
$previousWhere = NULL;
if( $dateRange !== NULL )
{
if( is_array( $dateRange ) )
{
$where = array(
array( 'start_date > ?', $dateRange['start']->getTimestamp() ),
array( 'start_date < ?', $dateRange['end']->getTimestamp() ),
);
}
else
{
$currentDate = new DateTime;
$interval = static::getInterval( $dateRange );
$initialTimestamp = $currentDate->sub( $interval )->getTimestamp();
$where = array( array( 'start_date > ?', $initialTimestamp ) );
$previousWhere = array( array( 'start_date BETWEEN ? AND ?', $currentDate->sub( $interval )->getTimestamp(), $initialTimestamp ) );
}
}
else if ( isset( Request::i()->nodes ) and Request::i()->nodes )
{
$where = array( array( Db::i()->in( 'forum_id', explode( ',', Request::i()->nodes ) ) ) );
}
//$where[] = array( 'type=?', 'solved' );
$where[] = array( Db::i()->in( 'forum_id', iterator_to_array( Db::i()->select( 'id', 'forums_forums', '(' . Db::i()->bitwiseWhere( Forum::$bitOptions['forums_bitoptions'], 'bw_enable_answers' ) . ') OR ( ' . Db::i()->bitwiseWhere( Forum::$bitOptions['forums_bitoptions'], 'bw_solved_set_by_moderator' ) . ' )' ) ) ) );
/* Get the current and previous values */
switch( $subBlock )
{
case 'percentagesolved':
$total = Db::i()->select( 'COUNT(*)', 'forums_topics', $this->_modifyWhereClause( $where ) )->first();
$solvedWhere = $this->_modifyWhereClause( $where );
$solvedWhere[] = [ 'core_solved_index.id is not null' ];
$solvedWhere[] = [ 'type=?', 'solved' ];
$solved = Db::i()->select( 'COUNT(*)', 'forums_topics', $solvedWhere )->join( 'core_solved_index', "core_solved_index.app='forums' AND core_solved_index.item_id=forums_topics.tid")->first();
$value = $total ? round( $solved / $total * 100, 2 ) : 0;
if( $previousWhere !== NULL )
{
$previousTotal = Db::i()->select( 'COUNT(*)', 'forums_topics', $this->_modifyWhereClause( $previousWhere ) )->first();
$previousSolved = Db::i()->select( 'COUNT(*)', 'forums_topics', array_merge( $this->_modifyWhereClause( $previousWhere ), array( array( 'core_solved_index.id IS NOT NULL' ) ) ) )->join( 'core_solved_index', "core_solved_index.app='forums' AND core_solved_index.item_id=forums_topics.tid")->first();
$previousValue = $previousTotal ? round( $previousSolved / $previousTotal * 100, 2 ) : 0;
}
return [
'statsreports_current_count' => $value,
'statsreports_previous_count' => $previousValue,
];
case 'averagetimesolved':
$value = Db::i()->select( 'AVG(CAST(core_solved_index.solved_date AS SIGNED)-forums_topics.start_date)', 'forums_topics', array_merge( $this->_modifyWhereClause( $where ), array( array( 'core_solved_index.id IS NOT NULL' ) ) ) )->join( 'core_solved_index', "core_solved_index.app='forums' AND core_solved_index.item_id=forums_topics.tid")->first();
if( $previousWhere !== NULL )
{
$previousValue = Db::i()->select( 'AVG(CAST(core_solved_index.solved_date AS SIGNED)-forums_topics.start_date)', 'forums_topics', array_merge( $this->_modifyWhereClause( $previousWhere ), array( array( 'core_solved_index.id IS NOT NULL' ) ) ) )->join( 'core_solved_index', "core_solved_index.app='forums' AND core_solved_index.item_id=forums_topics.tid")->first();
}
return [
'statsreports_current_count' => $value,
'statsreports_previous_count' => $previousValue
];
}
return [
'statsreports_current_count' => $value,
'statsreports_previous_count' => $previousValue
];
}
/**
* Modify the where clause to apply other filters
*
@@ -213,7 +317,7 @@ class Solved extends OverviewStatisticsAbstract
}
$form = new Form;
$form->attributes['data-controller'] = 'core.admin.stats.nodeFilters';
$form->class = "ipsForm--vertical";
$form->attributes['data-block'] = Request::i()->blockKey;
$form->attributes['data-subblock'] = $subBlock;
$form->add( new Node( Forum::$nodeTitle, NULL, TRUE, array( 'class' => '\IPS\forums\Forum', 'multiple' => TRUE, 'clubs' => FALSE ) ) );
@@ -0,0 +1,97 @@
<?php
/**
* @brief Background Task
* @author <a href='https://www.invisioncommunity.com'>Invision Power Services, Inc.</a>
* @copyright (c) Invision Power Services, Inc.
* @license https://www.invisioncommunity.com/legal/standards/
* @package Invision Community
* @subpackage Forums
* @since 22 Sep 2025
*/
namespace IPS\forums\extensions\core\Queue;
use IPS\Db;
use IPS\Extensions\QueueAbstract;
use IPS\Member;
use IPS\Task\Queue\OutOfRangeException as QueueOutOfRangeException;
use OutOfRangeException;
use function defined;
use const IPS\REBUILD_NORMAL;
/* To prevent PHP errors (extending class does not exist) revealing path */
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
{
header( ( $_SERVER['SERVER_PROTOCOL'] ?? 'HTTP/1.0' ) . ' 403 Forbidden' );
exit;
}
/**
* Background Task
*/
class RebuildHelpfulCount extends QueueAbstract
{
/**
* Parse data before queuing
*
* @param array $data
* @return array|null
*/
public function preQueueData( array $data ): ?array
{
$data['count'] = (int) Db::i()->select( 'count(*)', 'forums_topics' )->first();
$data['lastId'] = 0;
return $data;
}
/**
* Run Background Task
*
* @param array $data Data as it was passed to \IPS\Task::queue()
* @param int $offset Offset
* @return int New offset
* @throws QueueOutOfRangeException Indicates offset doesn't exist and thus task is complete
*/
public function run( array &$data, int $offset ): int
{
$limit = REBUILD_NORMAL;
$currentId = $data['lastId'] ?? 0;
$rows = Db::i()->select( 'tid, count(id) as helpful', 'forums_topics', [ 'tid>?', $currentId ], 'tid', $limit, 'tid' )
->join( 'core_solved_index', [ 'core_solved_index.app=? and core_solved_index.type=? and forums_topics.tid=core_solved_index.item_id', 'forums', 'helpful'] );
foreach( $rows as $row )
{
if( $row['helpful'] )
{
Db::i()->update( 'forums_topics', [ 'helpful_count' => $row['helpful'] ], [ 'tid=?', $row['tid'] ] );
}
$data['lastId'] = $row['tid'];
$offset++;
}
if( $currentId === $data['lastId'] )
{
throw new QueueOutOfRangeException;
}
return $offset;
}
/**
* Get Progress
*
* @param array $data Data as it was passed to \IPS\Task::queue()
* @param int $offset Offset
* @return array( 'text' => 'Doing something...', 'complete' => 50 ) Text explaining task and percentage complete
* @throws OutOfRangeException Indicates offset doesn't exist and thus task is complete
*/
public function getProgress( array $data, int $offset ): array
{
return array(
'text' => Member::loggedIn()->language()->addToStack('queue_rebuilding_helpful_counts'),
'complete' => $offset ? ( round( 100 / $data['count'] * $offset, 2 ) ) : 100
);
}
}
@@ -58,16 +58,6 @@ class RssImport extends RssImportAbstract
return array( 'IPS\\forums\\Topic' => Member::loggedIn()->language()->addToStack('__app_forums') );
}
/**
* Show in the Admin CP?
*
* @return boolean
*/
public function showInAdminCp(): bool
{
return true;
}
/**
* Node selector options
*
-4
View File
@@ -41,8 +41,6 @@ class Forums extends MemberListenerType
*/
public function onMerge( Member $member, Member $member2 ) : void
{
Db::i()->update( 'forums_answer_ratings', array( 'member' => $member->member_id ), array( '`member`=?', $member2->member_id ), array(), NULL, Db::IGNORE );
Db::i()->update( 'forums_question_ratings', array( 'member' => $member->member_id ), array( '`member`=?', $member2->member_id ), array(), NULL, Db::IGNORE );
Db::i()->update( 'forums_view_method', array( 'member_id' => $member->member_id ), array( 'member_id=?', $member2->member_id ), array(), NULL, Db::IGNORE );
if ( Settings::i()->archive_on )
@@ -77,8 +75,6 @@ class Forums extends MemberListenerType
*/
public function onDelete( Member $member ) : void
{
Db::i()->delete( 'forums_answer_ratings', array( '`member`=?', $member->member_id ) );
Db::i()->delete( 'forums_question_ratings', array( '`member`=?', $member->member_id ) );
Db::i()->delete( 'forums_view_method', array( 'member_id=?', $member->member_id ) );
}
}
@@ -16,9 +16,11 @@ namespace IPS\forums\modules\admin\forums;
use DomainException;
use Exception;
use IPS\Application;
use IPS\Content\Tag;
use IPS\Db;
use IPS\Dispatcher;
use IPS\Dispatcher\Controller;
use IPS\forums\Forum;
use IPS\forums\Topic;
use IPS\Helpers\Form;
use IPS\Helpers\Form\CheckboxSet;
@@ -33,12 +35,11 @@ use IPS\Http\Url;
use IPS\IPS;
use IPS\Member;
use IPS\Output;
use IPS\Platform\Bridge;
use IPS\Patterns\ActiveRecordIterator;
use IPS\Request;
use IPS\Session;
use IPS\Settings as SettingsClass;
use IPS\Theme;
use LengthException;
use function count;
use function defined;
use function in_array;
@@ -79,6 +80,10 @@ class settings extends Controller
{
$tabs['archiving'] = 'archiving';
}
if( Member::loggedIn()->hasAcpRestriction( 'forums', 'forums', 'autolock_settings' ) )
{
$tabs['autolock'] = 'autolock';
}
$activeTab = Request::i()->tab ?: 'settings';
$methodFunction = 'manage' . IPS::mb_ucfirst( $activeTab );
@@ -94,7 +99,7 @@ class settings extends Controller
Output::i()->output = Theme::i()->getTemplate( 'global', 'core' )->tabs( $tabs, $activeTab, $activeTabContents, Url::internal( "app=forums&module=forums&controller=settings" ) );
}
}
/**
* Archive settings
*
@@ -164,7 +169,6 @@ class settings extends Controller
case 'post':
case 'view':
case 'rating':
if ( $rule['archive_skip'] )
{
$existingValues[ "archive_not_topic_{$rule['archive_field']}" ] = array( $rule['archive_value'], $rule['archive_text'], FALSE );
@@ -209,12 +213,10 @@ class settings extends Controller
'archive_topic_poll',
'archive_topic_post',
'archive_topic_view',
'archive_topic_rating',
'archive_topic_starter',
'archive_topic_not_forums',
'archive_not_topic_post',
'archive_not_topic_view',
'archive_not_topic_rating',
'archive_not_last_post',
'archive_topic_starter_not',
'form_header_archive_topics_where',
@@ -249,7 +251,6 @@ class settings extends Controller
$form->add( new CheckboxSet( 'archive_topic_poll', $existingValues['archive_topic_poll'] ?? array( 1, 0 ), FALSE, array( 'options' => array( 1 => 'topic_has_poll', 0 => 'topic_does_not_have_poll' ) ), NULL, NULL, NULL, 'archive_topic_poll' ) );
$form->add( new Custom( 'archive_topic_post', $existingValues['archive_topic_post'] ?? array( NULL, NULL, TRUE ), FALSE, array( 'getHtml' => array( $this, '_greaterThanLessThanField' ) ), NULL, NULL, NULL, 'archive_topic_post' ) );
$form->add( new Custom( 'archive_topic_view', $existingValues['archive_topic_view'] ?? array( NULL, NULL, TRUE ), FALSE, array( 'getHtml' => array( $this, '_greaterThanLessThanField' ) ), NULL, NULL, NULL, 'archive_topic_view' ) );
$form->add( new Custom( 'archive_topic_rating', $existingValues['archive_topic_rating'] ?? array( NULL, NULL, TRUE ), FALSE, array( 'getHtml' => array( $this, '_greaterThanLessThanField' ) ), NULL, NULL, NULL, 'archive_topic_rating' ) );
$form->add( new FormMember( 'archive_topic_starter', $existingValues['archive_topic_starter'] ?? array(), FALSE, array( 'multiple' => 999999 ), NULL, NULL, NULL, 'archive_topic_starter' ) );
$form->addHeader( 'archive_topics_not_where' );
$form->add( new Node( 'archive_topic_not_forums', $existingValues['archive_topic_not_forums'] ?? array(), FALSE, array( 'class' => 'IPS\forums\Forum', 'multiple' => TRUE, 'permissionCheck' => function ( $forum )
@@ -258,7 +259,6 @@ class settings extends Controller
} ), NULL, NULL, NULL, 'archive_topic_not_forums' ) );
$form->add( new Custom( 'archive_not_topic_post', $existingValues['archive_not_topic_post'] ?? array( NULL, NULL, TRUE ), FALSE, array( 'getHtml' => array( $this, '_greaterThanLessThanField' ) ), NULL, NULL, NULL, 'archive_not_topic_post' ) );
$form->add( new Custom( 'archive_not_topic_view', $existingValues['archive_not_topic_view'] ?? array( NULL, NULL, TRUE ), FALSE, array( 'getHtml' => array( $this, '_greaterThanLessThanField' ) ), NULL, NULL, NULL, 'archive_not_topic_view' ) );
$form->add( new Custom( 'archive_not_topic_rating', $existingValues['archive_not_topic_rating'] ?? array( NULL, NULL, TRUE ), FALSE, array( 'getHtml' => array( $this, '_greaterThanLessThanField' ) ), NULL, NULL, NULL, 'archive_not_topic_rating' ) );
$form->add( new Custom( 'archive_not_last_post', $existingValues['archive_not_last_post'] ?? array( '>', 0, 'm', TRUE ), FALSE, array( 'getHtml' => array( $this, '_beforeAfterTimeAgo' ), 'validate' => array( $this, '_validateBeforeAfterTimeAgo' ) ), NULL, NULL, NULL, 'archive_not_last_post' ) );
$form->add( new FormMember( 'archive_topic_starter_not', $existingValues['archive_topic_starter_not'] ?? array(), FALSE, array( 'multiple' => 999999 ), NULL, NULL, NULL, 'archive_topic_starter_not' ) );
@@ -344,7 +344,7 @@ class settings extends Controller
);
}
}
elseif( in_array( $k, array( 'archive_topic_post', 'archive_topic_view', 'archive_topic_rating' ) ) )
elseif( in_array( $k, array( 'archive_topic_post', 'archive_topic_view' ) ) )
{
if ( !isset( $v[2] ) and $v[1] and $v[0] )
{
@@ -359,7 +359,7 @@ class settings extends Controller
);
}
}
elseif( in_array( $k, array( 'archive_not_topic_post', 'archive_not_topic_view', 'archive_not_topic_rating' ) ) )
elseif( in_array( $k, array( 'archive_not_topic_post', 'archive_not_topic_view' ) ) )
{
if ( !isset( $v[2] ) and $v[1] and $v[0] )
{
@@ -641,11 +641,6 @@ class settings extends Controller
$form->add( new Number( 'forums_solved_topic_reengage', SettingsClass::i()->forums_solved_topic_reengage , FALSE, array( 'min' => 1, 'max' => 365, 'unlimited' => 0, 'unlimitedLang' => 'forums_solved_topic_reengage_never' ), NULL, Member::loggedIn()->language()->addToStack('forums_solved_nudge_experts_prefix'), Member::loggedIn()->language()->addToStack('forums_solved_nudge_experts_suffix') ) );
$form->add( new Number( 'forums_helpful_highlight', SettingsClass::i()->forums_helpful_highlight , FALSE, array( 'min' => 1, 'unlimited' => 0, 'unlimitedLang' => 'forums_helpful_highlight_never' ), NULL, Member::loggedIn()->language()->addToStack('forums_helpful_highlight_prefix'), Member::loggedIn()->language()->addToStack('forums_helpful_highlight_suffix') ) );
if( Bridge::i()->featureIsEnabled( 'experts' ) )
{
$form->add( new Number( 'forums_solved_nudge_experts', SettingsClass::i()->forums_solved_nudge_experts, FALSE, array( 'min' => 1, 'max' => 365, 'unlimited' => 0, 'unlimitedLang' => 'forums_solved_nudge_experts_never' ), NULL, Member::loggedIn()->language()->addToStack('forums_solved_topic_reengage_prefix'), Member::loggedIn()->language()->addToStack('forums_solved_topic_reengage_suffix') ) );
}
$form->add( new YesNo( "forum_post_use_minimal_editor", (bool) SettingsClass::i()->forum_post_use_minimal_editor, false ) );
$form->addHeader('topic_overview_settings');
@@ -699,4 +694,93 @@ class settings extends Controller
return $form;
}
/**
* Auto-Lock topics settings
*
* @return Form|string
*/
protected function manageAutolock() : Form|string
{
$settings = SettingsClass::i()->autolock_topic_settings ? json_decode( SettingsClass::i()->autolock_topic_settings, true ) : [];
$form = new Form;
$form->add( new YesNo( 'autolock_enabled', $settings['enabled'] ?? null, false, [
'togglesOn' => [ 'autolock_days', 'autolock_pinned', 'autolock_featured', 'autolock_forums', 'autolock_members', 'autolock_tags' ]
] ) );
$form->add( new Number( 'autolock_days', $settings['days'] ?? 7, null, suffix: Member::loggedIn()->language()->addToStack( 'autolock_days_suffix' ), id: 'autolock_days' ) );
$form->add( new YesNo( 'autolock_pinned', $settings['pinned'] ?? false, false, id: 'autolock_pinned' ) );
$form->add( new YesNo( 'autolock_featured', $settings['featured'] ?? false, id: 'autolock_featured' ) );
$form->add( new Node( 'autolock_forums', $settings['forums'] ?? null, false, [
'class' => Forum::class,
'multiple' => true
], id: 'autolock_forums' ) );
$excludedMembers = [];
if( !empty( $settings['members'] ) )
{
$excludedMembers = iterator_to_array(
new ActiveRecordIterator(
Db::i()->select( '*', 'core_members', Db::i()->in( 'member_id', $settings['members'] ) ),
Member::class
)
);
}
$form->add( new FormMember( 'autolock_members', count( $excludedMembers ) ? $excludedMembers : null, false, [ 'multiple' => null ], id: 'autolock_members' ) );
$form->add( new Text( 'autolock_tags', $settings['tags'] ?? null, false, [
'autocomplete' => array(
'unique' => TRUE,
'source' => Tag::allTags(),
'resultItemTemplate' => 'core.autocomplete.tagsResultItem',
'freeChoice' => false,
'minimized' => false,
'alphabetical' => true,
'addTokenText' => Member::loggedIn()->language()->get( 'tags_optional' ),
)
], id: 'autolock_tags' ) );
if( $values = $form->values() )
{
if( $values['autolock_enabled'] )
{
$members = FormMember::stringValue( $values['autolock_members'] );
$settings = [
'enabled' => true,
'days' => $values['autolock_days'],
'pinned' => $values['autolock_pinned'],
'featured' => $values['autolock_featured'],
'members' => ( $members ? explode( "\n", $members ) : null ),
'forums' => ( !empty( $values['autolock_forums'] ) ? array_keys( $values['autolock_forums'] ) : null ),
'tags' => $values['autolock_tags']
];
}
else
{
$settings = [ 'enabled' => false ];
}
$form->saveAsSettings([
'autolock_topic_settings' => json_encode( $settings )
]);
Session::i()->log( 'acplogs__forums_autolock' );
/* And disable task if this feaure is disabled */
if( !$values['autolock_enabled'] )
{
Db::i()->update( 'core_tasks', array( 'enabled' => 0 ), array( '`key`=?', 'autolock' ) );
}
/* Or enable it if necessary */
else
{
Db::i()->update( 'core_tasks', array( 'enabled' => 1 ), array( '`key`=?', 'autolock' ) );
}
Output::i()->redirect( Url::internal( 'app=forums&module=forums&controller=settings&tab=autolock' ), 'saved' );
}
return $form;
}
}
@@ -68,7 +68,8 @@ class forums extends Controller
* @return void
*/
protected function manage() : void
{
{
Output::i()->bodyAttributes['contentClass'] = ForumClass::class;
$forum = NULL;
try
{
@@ -538,7 +539,7 @@ class forums extends Controller
}
/* Data Layer Context */
if ( !Request::i()->isAjax AND Settings::i()->core_datalayer_enabled )
if ( !Request::i()->isAjax AND DataLayer::enabled() )
{
foreach ( $forum->getDataLayerProperties() as $key => $value )
{
@@ -47,6 +47,7 @@ use function count;
use function defined;
use function in_array;
use function intval;
use function is_numeric;
use const IPS\LARGE_TOPIC_REPLIES;
if ( !defined( '\IPS\SUITE_UNIQUE_KEY' ) )
@@ -281,12 +282,12 @@ class topic extends Controller
}
array_unshift( $paginationKeys, 'queued_posts' );
$customPaginationWhere[] = array( 'topic_id=? AND queued=1', $topic->id );
$customPaginationWhere[] = array( 'topic_id=? AND queued=1', $topic->tid );
}
$customPaginationWhere = Bridge::i()->modifyTopicCommentFilter( $topic, $customPaginationWhere );
if ( !empty( $customPaginationWhere ) )
{
$customPaginationWhere[] = array( "topic_id=?", $topic->id );
$customPaginationWhere[] = array( "topic_id=?", $topic->tid );
$authorCol = Post::$databasePrefix . Post::$databaseColumnMap['author'];
if ( $topic->canViewHiddenComments() )
{
@@ -393,9 +394,6 @@ class topic extends Controller
/* A convenient hook point to do any further set up */
$this->finishManage( $topic );
$votes = array();
$topicVotes = array();
/* Online User Location */
Session::i()->setLocation( $topic->url(), ( $topic->container()->password or !$topic->container()->can_view_others ) ? 0 : $topic->onlineListPermissions(), 'loc_forums_viewing_topic', array( $topic->title => FALSE ) );
@@ -473,7 +471,6 @@ class topic extends Controller
'text' => $truncatedAnswer,
'url' => (string) $answer->url(),
'dateCreated' => DateTime::ts( $answer->$dateColumn )->format( DateTimeInterface::ATOM ),
'upvoteCount' => ( $topic->isArchived() ) ? $answer->field_int : $answer->post_field_int,
'author' => array(
'@type' => 'Person',
'name' => Member::load( $answer->$authorIdColumn )->name,
@@ -506,7 +503,6 @@ class topic extends Controller
'text' => $lastComment->truncated( TRUE, NULL ),
'url' => (string) $lastComment->url(),
'dateCreated' => DateTime::ts( $lastComment->$dateColumn )->format( DateTime::ISO8601 ),
'upvoteCount' => ( $topic->isArchived() ) ? $lastComment->field_int : $lastComment->post_field_int,
'author' => array(
'@type' => 'Person',
'name' => Member::load( $lastComment->$authorIdColumn )->name,
@@ -576,7 +572,11 @@ class topic extends Controller
if ( $truncatedComment = $comment->truncated( TRUE, NULL ) )
{
$url = $topic->url()->setPage( 'page', Request::i()->page );
$url = $topic->url();
if( isset( Request::i()->page ) and is_numeric( Request::i()->page ) )
{
$url = $url->setPage( 'page', Request::i()->page );
}
$commentJson[$i] = array(
'@type' => $isQuestion ? 'Answer' : 'Comment',
@@ -597,14 +597,7 @@ class topic extends Controller
$commentJson[$i]['author']['url'] = (string)Member::load( $comment->$authorIdColumn )->url();
}
if( $isQuestion )
{
$commentJson[$i]['upvoteCount'] = ( $topic->isArchived() ) ? $comment->field_int : $comment->post_field_int;
}
else
{
$commentJson[$i]['upvoteCount'] = $comment->reactionCount();
}
$commentJson[$i]['upvoteCount'] = $comment->reactionCount();
$i++;
}
@@ -649,6 +642,13 @@ class topic extends Controller
$current = $firstPost;
}
/* Set og:image meta tags */
if( count( $file = $topic->imageAttachments(1 ) ) )
{
$object = File::get( 'core_Attachment', $file[0]['attach_location'] );
Output::i()->metaTags['og:image'] = (string) $object->url->setScheme( ( mb_substr( Settings::i()->base_url, 0, 5 ) === 'https' ) ? 'https' : 'http' );
}
if( $current )
{
Output::i()->jsonLd['topic'] = array_merge_recursive( array(
@@ -658,8 +658,6 @@ class topic extends Controller
'dateCreated' => DateTime::ts( $topic->start_date )->format( DateTimeInterface::ATOM ),
'datePublished' => DateTime::ts( $topic->start_date )->format( DateTimeInterface::ATOM ),
'dateModified' => DateTime::ts( $topic->last_post )->format( DateTimeInterface::ATOM ),
/* Image is required, but we don't have "topic images", so we'll use topic starter's profile photo for now */
'image' => (string) Member::load( $topic->starter_id )->get_photo( TRUE, TRUE ),
'author' => array(
'@type' => 'Person',
'name' => Member::load( $topic->starter_id )->name,
@@ -678,6 +676,11 @@ class topic extends Controller
)
)
), Output::i()->jsonLd['topic'] );
if( isset( Output::i()->metaTags['og:image'] ) )
{
Output::i()->jsonLd['topic']['image'] = Output::i()->metaTags['og:image'];
}
}
if( !$topic->isArchived() )
@@ -689,13 +692,6 @@ class topic extends Controller
];
}
/* Add og:image meta tags */
if( count( $file = $topic->imageAttachments(1 ) ) )
{
$object = File::get( 'core_Attachment', $file[0]['attach_location'] );
Output::i()->metaTags['og:image'] = (string) $object->url->setScheme( ( mb_substr( Settings::i()->base_url, 0, 5 ) === 'https' ) ? 'https' : 'http' );
}
/* Noindex if helpful filter applied */
if( isset( Request::i()->show ) )
{
@@ -707,7 +703,7 @@ class topic extends Controller
/* Show topic */
Output::i()->cssFiles = array_merge( Output::i()->cssFiles, Theme::i()->css( 'topics.css', 'forums' ) );
Output::i()->output .= Theme::i()->getTemplate( 'topics' )->topic( $topic, $comments, $votes, $nextUnread, $pagination, $topicVotes, $firstPost, $viewerIsFollowingTheseExperts );
Output::i()->output .= Theme::i()->getTemplate( 'topics' )->topic( $topic, $comments, $nextUnread, $pagination, $firstPost, $viewerIsFollowingTheseExperts );
return null;
}
@@ -917,128 +913,6 @@ class topic extends Controller
Output::i()->redirect( $topic->url() );
}
/**
* Rate Question
*
* @return void
*/
public function rateQuestion() : void
{
/* CSRF Check */
Session::i()->csrfCheck();
/* Get the question */
try
{
$question = TopicClass::loadAndCheckPerms( Request::i()->id );
}
catch ( OutOfRangeException $e )
{
Output::i()->error( 'node_error', '2F173/8', 404, '' );
}
/* Voting up or down? */
$rating = intval( Request::i()->rating );
if ( $rating !== 1 and $rating !== -1 )
{
Output::i()->error( 'form_bad_value', '2F173/A', 403, '' );
}
/* Check we can cast this vote */
if ( !$question->canVote( $rating ) )
{
Output::i()->error( 'no_module_permission', '2F173/9', 403, '' );
}
/* If we have an existing vote, remove it first */
$ratings = $question->votes();
if ( isset( $ratings[ Member::loggedIn()->member_id ] ) )
{
Db::i()->delete( 'forums_question_ratings', array( 'topic=? AND `member`=?', $question->tid, Member::loggedIn()->member_id ) );
}
/* Revoting for the same thing you already voted for should remove your vote - so don't insert if we voted for the same thing we did before */
if ( !isset( $ratings[ Member::loggedIn()->member_id ] ) OR $ratings[ Member::loggedIn()->member_id ] != $rating )
{
Db::i()->insert( 'forums_question_ratings', array(
'topic' => $question->tid,
'forum' => $question->forum_id,
'member' => Member::loggedIn()->member_id,
'rating' => $rating,
'date' => time()
), TRUE );
}
/* Rebuild count */
$question->question_rating = Db::i()->select( 'SUM(rating)', 'forums_question_ratings', array( 'topic=?', $question->tid ), NULL, NULL, NULL, NULL, Db::SELECT_FROM_WRITE_SERVER )->first();
$question->save();
/* Redirect back */
Output::i()->redirect( $question->url() );
}
/**
* Rate Answer
*
* @return void
*/
public function rateAnswer() : void
{
Session::i()->csrfCheck();
try
{
$question = TopicClass::loadAndCheckPerms( Request::i()->id );
$answer = Post::loadAndCheckPerms( Request::i()->answer );
}
catch ( Exception $e )
{
Output::i()->error( 'node_error', '2F173/4', 404, '' );
}
$rating = intval( Request::i()->rating );
if ( !$answer->item()->can('read') or !$answer->canVote( $rating ) )
{
Output::i()->error( 'no_module_permission', '2F173/5', 403, '' );
}
$rating = intval( Request::i()->rating );
if ( $rating !== 1 and $rating !== -1 )
{
Output::i()->error( 'form_bad_value', '2F173/6', 403, '' );
}
$ratings = $question->answerVotes( Member::loggedIn() );
/* If we've already rated the answer, remove that first */
Db::i()->delete( 'forums_answer_ratings', array( 'topic=? AND post=? AND `member`=?', $question->tid, $answer->pid, Member::loggedIn()->member_id ) );
/* Revoting for the same thing you already voted for should remove your vote - so don't insert if we voted for the same thing we did before */
if ( !isset( $ratings[ $answer->pid ] ) OR $ratings[ $answer->pid ] != $rating )
{
Db::i()->insert( 'forums_answer_ratings', array(
'post' => $answer->pid,
'topic' => $question->tid,
'member' => Member::loggedIn()->member_id,
'rating' => $rating,
'date' => time()
), TRUE );
}
$answer->post_field_int = (int) Db::i()->select( 'SUM(rating)', 'forums_answer_ratings', array( 'post=?', $answer->pid ), NULL, NULL, NULL, NULL, Db::SELECT_FROM_WRITE_SERVER )->first();
$answer->save();
if ( Request::i()->isAjax() )
{
Output::i()->json( array( 'votes' => $answer->post_field_int, 'canVoteUp' => $answer->canVote(1), 'canVoteDown' => $answer->canVote(-1) ) );
}
else
{
Output::i()->redirect( $answer->url() );
}
}
/**
* Set Best Answer
*
@@ -0,0 +1,22 @@
{
"id": 5000075,
"name": "5.0.7 Beta 1",
"steps": {
"queries": true,
"lang": true,
"theme": true,
"themeeditor": true,
"javascript": true,
"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,14 @@
{
"files": {
"added": [],
"edited": [
"forums\/front\/controllers\/forum\/ips.forum.flow.js"
],
"removed": []
},
"orders": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,14 @@
{
"normal": {
"added": [
"can_assign_topic"
],
"edited": [],
"removed": []
},
"js": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,34 @@
{
"1": {
"method": "delete",
"params": [
"core_solved_index",
[
[
"member_id not in (?)",
{
"query": "SELECT member_id FROM `core_members`",
"binds": [],
"isUnion": false
}
]
]
]
},
"2": {
"method": "delete",
"params": [
"core_solved_index",
[
[
"member_given not in (?)",
{
"query": "SELECT member_id FROM `core_members`",
"binds": [],
"isUnion": false
}
]
]
]
}
}
@@ -0,0 +1,32 @@
{
"html": {
"added": [],
"edited": [
"front\/forums\/clubForums",
"front\/forums\/forumDisplay",
"front\/forums\/forumPasswordPopup",
"front\/forums\/forumSelector",
"front\/forums\/forumTable",
"front\/index\/index",
"front\/index\/indexButtons",
"front\/index\/simplifiedViewForumSidebar",
"front\/index\/simplifiedViewSidebar",
"front\/submit\/createTopicForm",
"front\/topics\/postContainer",
"front\/topics\/topic"
],
"removed": []
},
"css": {
"added": [],
"edited": [
"front\/forums.css"
],
"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": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000076,
"name": "5.0.7 Beta 2",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"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,17 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_forums_forum",
"layout_forums_topic",
"layout_forums_post",
"layout_forum_topic_view_firstpost"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000077,
"name": "5.0.7 Beta 2",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"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,17 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_forums_forum",
"layout_forums_topic",
"layout_forums_post",
"layout_forum_topic_view_firstpost"
],
"removed": []
}
}
@@ -0,0 +1,7 @@
{
"added": [],
"edited": [],
"removed": [
"app=forums&module=forums&controller=settings&searchResult=form_forums_solved_nudge_experts"
]
}
@@ -0,0 +1,22 @@
{
"id": 5000078,
"name": "5.0.7 Beta 3",
"steps": {
"queries": false,
"lang": true,
"theme": false,
"themeeditor": true,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": true,
"settings": true,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,18 @@
{
"normal": {
"added": [],
"edited": [],
"removed": [
"forums_solved_nudge_experts",
"forums_solved_nudge_experts_prefix",
"forums_solved_nudge_experts_suffix",
"forums_solved_nudge_experts_never",
"forums_solved_nudge_experts_desc"
]
},
"js": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,7 @@
{
"added": [],
"edited": [],
"removed": [
"forums_solved_nudge_experts"
]
}
@@ -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": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000079,
"name": "5.0.7 Beta 4",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"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,17 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_forums_forum",
"layout_forums_topic",
"layout_forums_post",
"layout_forum_topic_view_firstpost"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000080,
"name": "5.0.7",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"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,17 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_forums_forum",
"layout_forums_topic",
"layout_forums_post",
"layout_forum_topic_view_firstpost"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000081,
"name": "5.0.7",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"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,17 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_forums_forum",
"layout_forums_topic",
"layout_forums_post",
"layout_forum_topic_view_firstpost"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000082,
"name": "5.0.7",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"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,17 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_forums_forum",
"layout_forums_topic",
"layout_forums_post",
"layout_forum_topic_view_firstpost"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000800,
"name": "5.0.8 Alpha 1",
"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,25 @@
{
"html": {
"added": [],
"edited": [
"front\/index\/forumGridItem",
"front\/index\/forumRow",
"front\/index\/forumSummaryRow",
"front\/index\/index",
"front\/index\/simplifiedViewSidebar",
"front\/widgets\/postFeed",
"front\/widgets\/topicFeedRow"
],
"removed": []
},
"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": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000801,
"name": "5.0.8 Alpha 2",
"steps": {
"queries": false,
"lang": true,
"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,17 @@
{
"normal": {
"added": [
"__defart_nodegroup__forums_pl",
"__defart_nodegroup__forums",
"forums_solved_nudge_experts_prefix",
"forums_solved_nudge_experts_suffix"
],
"edited": [],
"removed": []
},
"js": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,19 @@
{
"html": {
"added": [],
"edited": [
"front\/forums\/forumDisplay"
],
"removed": []
},
"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": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000802,
"name": "5.0.8 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"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,17 @@
{
"categories": {
"added": [],
"edited": [],
"removed": []
},
"settings": {
"added": [],
"edited": [
"layout_forums_forum",
"layout_forums_topic",
"layout_forums_post",
"layout_forum_topic_view_firstpost"
],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000803,
"name": "5.0.8 Beta 2",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"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,22 @@
{
"id": 5000804,
"name": "5.0.8 Beta 3",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"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,22 @@
{
"id": 5000805,
"name": "5.0.8",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"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,22 @@
{
"id": 5000900,
"name": "5.0.9 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"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,22 @@
{
"id": 5000901,
"name": "5.0.9 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"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,22 @@
{
"id": 5000902,
"name": "5.0.9 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"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,22 @@
{
"id": 5000903,
"name": "5.0.9 Beta 2",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"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,22 @@
{
"id": 5000904,
"name": "5.0.9",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"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,22 @@
{
"id": 5000905,
"name": "5.0.9",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"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,22 @@
{
"id": 5000906,
"name": "5.0.10 Beta 1",
"steps": {
"queries": false,
"lang": true,
"theme": true,
"themeeditor": false,
"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,17 @@
{
"normal": {
"added": [],
"edited": [
"ad_forum_listing",
"ad_topic_view"
],
"removed": [
"moderator_actions"
]
},
"js": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"html": {
"added": [],
"edited": [
"front\/submit\/createTopicForm",
"front\/submit\/createTopicModOptions",
"front\/widgets\/postFeed",
"front\/widgets\/topicFeedRow"
],
"removed": []
},
"css": {
"added": [],
"edited": [],
"removed": []
},
"resources": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5000907,
"name": "5.0.10 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"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,22 @@
{
"id": 5000908,
"name": "5.0.10 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"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,22 @@
{
"id": 5000909,
"name": "5.0.10 Beta 1",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"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,22 @@
{
"id": 5000910,
"name": "5.0.10 Beta 2",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"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,22 @@
{
"id": 5000911,
"name": "5.0.10 Beta 3",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"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,22 @@
{
"id": 5000912,
"name": "5.0.10 Beta 4",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"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,22 @@
{
"id": 5000913,
"name": "5.0.10 Beta 4",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"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,22 @@
{
"id": 5000914,
"name": "5.0.10",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"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,22 @@
{
"id": 5000915,
"name": "5.0.10",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"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,22 @@
{
"id": 5000916,
"name": "5.0.10",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"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,22 @@
{
"id": 5000917,
"name": "5.0.10",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"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,22 @@
{
"id": 5000918,
"name": "5.0.10",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"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,22 @@
{
"id": 5000919,
"name": "5.0.10",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"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,22 @@
{
"id": 5000920,
"name": "5.0.10",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": true,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": true,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,17 @@
{
"files": {
"added": [],
"edited": [],
"removed": []
},
"orders": {
"added": [
"global\/\/dev\/js\/\/framework\/",
"global\/\/dev\/js\/\/library\/",
"global\/\/dev\/js\/\/library\/\/jquery",
"global\/\/dev\/js\/\/library\/\/linkify"
],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,7 @@
{
"added": [
"app=forums&module=forums&controller=settings&tab=autolock"
],
"edited": [],
"removed": []
}
@@ -0,0 +1,22 @@
{
"id": 5001100,
"name": "5.0.11 Beta 1",
"steps": {
"queries": false,
"lang": true,
"theme": true,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": true,
"settings": true,
"tasks": true,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
@@ -0,0 +1,24 @@
{
"normal": {
"added": [
"r__autolock_settings",
"autolock",
"autolock_enabled",
"autolock_enabled_desc",
"autolock_days",
"autolock_days_suffix",
"autolock_pinned",
"autolock_featured",
"autolock_members",
"autolock_tags",
"autolock_forums"
],
"edited": [],
"removed": []
},
"js": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,7 @@
{
"added": [
"autolock_topic_settings"
],
"edited": [],
"removed": []
}
@@ -0,0 +1,7 @@
{
"added": [
"autolock"
],
"edited": [],
"removed": []
}
@@ -0,0 +1,23 @@
{
"html": {
"added": [],
"edited": [
"front\/forums\/clubForums",
"front\/forums\/topicHover",
"front\/topics\/post",
"front\/topics\/postContainer",
"front\/topics\/postHeader"
],
"removed": []
},
"css": {
"added": [],
"edited": [],
"removed": []
},
"resources": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5001101,
"name": "5.0.11 Beta 1",
"steps": {
"queries": true,
"lang": false,
"theme": true,
"themeeditor": false,
"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,25 @@
{
"1": {
"method": "changeIndex",
"params": [
"forums_archive_posts",
"archive_topic_id",
{
"type": "key",
"name": "archive_topic_id",
"columns": [
"archive_topic_id",
"archive_content_date",
"archive_id",
"archive_queued"
],
"length": [
null,
null,
null,
null
]
}
]
}
}
@@ -0,0 +1,29 @@
{
"html": {
"added": [],
"edited": [
"front\/forums\/forumDisplay",
"front\/forums\/topicRow",
"front\/forums\/topicRowSnippet",
"front\/index\/simplifiedTopicRow",
"front\/index\/simplifiedTopicRowSnippet",
"front\/submit\/createTopicForm",
"front\/topics\/topic",
"front\/widgets\/postFeed",
"front\/widgets\/topicFeedRow"
],
"removed": []
},
"css": {
"added": [],
"edited": [
"front\/topics.css"
],
"removed": []
},
"resources": {
"added": [],
"edited": [],
"removed": []
}
}
@@ -0,0 +1,22 @@
{
"id": 5001102,
"name": "5.0.11 Beta 2",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"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,22 @@
{
"id": 5001103,
"name": "5.0.11",
"steps": {
"queries": false,
"lang": false,
"theme": false,
"themeeditor": false,
"javascript": false,
"emailTemplates": false,
"acpSearchKeywords": false,
"settings": false,
"tasks": false,
"modules": false,
"widgets": false,
"customOptions": false,
"customRoutines": false
},
"forceMainUpgrader": false,
"forceManualDownloadNoCiC": false,
"forceManualDownloadCiC": false
}
Loaded 100 of 1407 files, more files were not shown because too many files have changed in this diff. Show more