From 35e19e581a5e61f13d37e536710604283b1f0ebf Mon Sep 17 00:00:00 2001 From: Alexander Ebert Date: Wed, 13 Aug 2014 15:52:55 +0200 Subject: [PATCH] Moderation queue management overhaul --- .../templates/moderationActivation.tpl | 65 ++++----- .../templates/moderationQueueAssignUser.tpl | 42 ++++++ .../templates/moderationReport.tpl | 86 ++++-------- wcfsetup/install/files/js/WCF.Moderation.js | 131 +++++++++++++++++- .../queue/ModerationQueue.class.php | 34 +++++ .../queue/ModerationQueueAction.class.php | 123 ++++++++++++++++ .../ModerationQueueActivationAction.class.php | 4 +- .../queue/ModerationQueueEditor.class.php | 23 +++ .../ModerationQueueReportAction.class.php | 4 +- .../lib/form/AbstractModerationForm.class.php | 99 +------------ wcfsetup/install/lang/de.xml | 7 + wcfsetup/install/lang/en.xml | 7 + 12 files changed, 418 insertions(+), 207 deletions(-) create mode 100644 com.woltlab.wcf/templates/moderationQueueAssignUser.tpl diff --git a/com.woltlab.wcf/templates/moderationActivation.tpl b/com.woltlab.wcf/templates/moderationActivation.tpl index baf7b2d074..0ad592644f 100644 --- a/com.woltlab.wcf/templates/moderationActivation.tpl +++ b/com.woltlab.wcf/templates/moderationActivation.tpl @@ -12,7 +12,12 @@ WCF.Language.addObject({ 'wcf.moderation.activation.enableContent.confirmMessage': '{lang}wcf.moderation.activation.enableContent.confirmMessage{/lang}', - 'wcf.moderation.activation.removeContent.confirmMessage': '{lang}wcf.moderation.activation.removeContent.confirmMessage{/lang}' + 'wcf.moderation.activation.removeContent.confirmMessage': '{lang}wcf.moderation.activation.removeContent.confirmMessage{/lang}', + 'wcf.moderation.assignedUser': '{lang}wcf.moderation.assignedUser{/lang}', + 'wcf.moderation.assignedUser.change': '{lang}wcf.moderation.assignedUser.change{/lang}', + 'wcf.moderation.assignedUser.error.notAffected': '{lang}wcf.moderation.assignedUser.error.notAffected{/lang}', + 'wcf.moderation.status.outstanding': '{lang}wcf.moderation.status.outstanding{/lang}', + 'wcf.moderation.status.processing': '{lang}wcf.moderation.status.processing{/lang}' }); }); //]]> @@ -21,45 +26,7 @@ -{capture assign='sidebar'} -
-
- {lang}wcf.moderation.report.details{/lang} - -
-
{lang}wcf.moderation.assignedUser{/lang}
-
-
    - {if $assignedUserID && ($assignedUserID != $__wcf->getUser()->userID)} -
  • - {/if} -
  • -
  • -
-
-
- {if $queue->assignedUser} -
-
-
{$queue->assignedUsername}
-
- {/if} - - {event name='detailsFields'} - -
- - {@SECURITY_TOKEN_INPUT_TAG} -
-
- - {event name='fieldsets'} -
- - {event name='boxes'} -{/capture} - -{include file='header' sidebarOrientation='right'} +{include file='header'}

{lang}wcf.moderation.activation{/lang}: {$queue->getTitle()}

@@ -70,6 +37,24 @@
{@$queue->lastChangeTime|time}
{/if} + +
+
{lang}wcf.moderation.assignedUser{/lang}
+
+ + {if $queue->assignedUserID} + {$queue->assignedUsername} + {else} + {lang}wcf.moderation.assignedUser.nobody{/lang} + {/if} + +
+
+ +
+
{lang}wcf.moderation.status{/lang}
+
{$queue->getStatus()}
+
{include file='userNotice'} diff --git a/com.woltlab.wcf/templates/moderationQueueAssignUser.tpl b/com.woltlab.wcf/templates/moderationQueueAssignUser.tpl new file mode 100644 index 0000000000..b42e51a53e --- /dev/null +++ b/com.woltlab.wcf/templates/moderationQueueAssignUser.tpl @@ -0,0 +1,42 @@ +
+
+
{lang}wcf.moderation.assignedUser{/lang}
+
+
    + {if $assignedUser && $assignedUser->userID != $__wcf->getUser()->userID} +
  • + {/if} +
  • +
  • +
  • + +
  • +
+
+
+ +
+ +
+
+ diff --git a/com.woltlab.wcf/templates/moderationReport.tpl b/com.woltlab.wcf/templates/moderationReport.tpl index a48f543430..b5da14e9a4 100644 --- a/com.woltlab.wcf/templates/moderationReport.tpl +++ b/com.woltlab.wcf/templates/moderationReport.tpl @@ -9,17 +9,17 @@ //queueID}, '{link controller='ModerationList'}{/link}'); - - new WCF.Search.User('#assignedUsername'); - $('#assignedUsername').click(function() { - $(this).parents('li').find('input[type=radio]').click(); - }); }); //]]> @@ -27,61 +27,7 @@ -{capture assign='sidebar'} -
-
- {lang}wcf.moderation.report.details{/lang} - -
-
{lang}wcf.moderation.assignedUser{/lang}
-
-
    - {if $assignedUserID && $assignedUserID != -1 && $assignedUserID != $__wcf->getUser()->userID} -
  • - {/if} -
  • -
  • -
  • - -
  • -
-
-
- {if $queue->assignedUser} -
-
-
{$queue->assignedUsername}
-
- {/if} - - {event name='detailsFields'} - -
- - {@SECURITY_TOKEN_INPUT_TAG} -
-
- - {event name='fieldsets'} -
- - {event name='boxes'} -{/capture} - -{include file='header' sidebarOrientation='right'} +{include file='header'}

{lang}wcf.moderation.report{/lang}: {$queue->getTitle()}

@@ -92,6 +38,24 @@
{@$queue->lastChangeTime|time}
{/if} + +
+
{lang}wcf.moderation.assignedUser{/lang}
+
+ + {if $queue->assignedUserID} + {$queue->assignedUsername} + {else} + {lang}wcf.moderation.assignedUser.nobody{/lang} + {/if} + +
+
+ +
+
{lang}wcf.moderation.status{/lang}
+
{$queue->getStatus()}
+
{include file='userNotice'} diff --git a/wcfsetup/install/files/js/WCF.Moderation.js b/wcfsetup/install/files/js/WCF.Moderation.js index 6e5208615d..a7e4435507 100644 --- a/wcfsetup/install/files/js/WCF.Moderation.js +++ b/wcfsetup/install/files/js/WCF.Moderation.js @@ -32,6 +32,12 @@ WCF.Moderation.Management = Class.extend({ */ _confirmationTemplate: { }, + /** + * dialog overlay + * @var jQuery + */ + _dialog: null, + /** * language item pattern * @var string @@ -73,15 +79,19 @@ WCF.Moderation.Management = Class.extend({ return; } + this._dialog = null; this._queueID = queueID; this._redirectURL = redirectURL; this._languageItem = languageItem; this._proxy = new WCF.Action.Proxy({ + failure: $.proxy(this._failure, this), success: $.proxy(this._success, this) }); $(this._buttonSelector).click($.proxy(this._click, this)); + + $('' + WCF.Language.get('wcf.moderation.assignedUser.change') + '').click($.proxy(this._clickAssignedUser, this)).insertAfter($('#moderationAssignedUserContainer > dd > span')); }, /** @@ -128,6 +138,18 @@ WCF.Moderation.Management = Class.extend({ }, this), { }, $innerTemplate); }, + /** + * Handles clicks on the assign user link. + */ + _clickAssignedUser: function() { + this._proxy.setOption('data', { + actionName: 'getAssignUserForm', + className: 'wcf\\data\\moderation\\queue\\ModerationQueueAction', + objectIDs: [ this._queueID ] + }); + this._proxy.sendRequest(); + }, + /** * Handles successful AJAX requests. * @@ -136,11 +158,112 @@ WCF.Moderation.Management = Class.extend({ * @param jQuery jqXHR */ _success: function(data, textStatus, jqXHR) { - var $notification = new WCF.System.Notification(WCF.Language.get('wcf.global.success')); - var self = this; - $notification.show(function() { - window.location = self._redirectURL; + switch (data.actionName) { + case 'getAssignUserForm': + if (this._dialog === null) { + this._dialog = $('
').hide().appendTo(document.body); + this._dialog.html(data.returnValues.template).wcfDialog({ + title: WCF.Language.get('wcf.moderation.assignedUser') + }); + } + else { + this._dialog.html(data.returnValues.template).wcfDialog('open'); + } + + this._dialog.find('button[data-type=submit]').click($.proxy(this._assignUser, this)); + break; + + case 'assignUser': + var $span = $('#moderationAssignedUserContainer > dd > span').empty(); + if (data.returnValues.userID) { + $('' + WCF.String.escapeHTML(data.returnValues.username) + '').appendTo($span); + } + else { + $span.append(data.returnValues.username) + } + + $span.append(' '); + + if (data.returnValues.newStatus) { + $('#moderationStatusContainer > dd').text(WCF.Language.get('wcf.moderation.status.' + data.returnValues.newStatus)); + } + + this._dialog.wcfDialog('close'); + + new WCF.System.Notification().show(); + break; + + default: + var $notification = new WCF.System.Notification(WCF.Language.get('wcf.global.success')); + var self = this; + $notification.show(function() { + window.location = self._redirectURL; + }); + break; + } + }, + + /** + * Handles errorneus AJAX requests. + * + * @param object data + * @param jQuery jqXHR + * @param string textStatus + * @param string errorThrown + */ + _failure: function(data, jqXHR, textStatus, errorThrown) { + if (data.returnValues && data.returnValues.fieldName && data.returnValues.fieldName == 'assignedUsername') { + this._dialog.find('small.innerError').remove(); + + var $errorString = ''; + switch (data.returnValues.errorType) { + case 'empty': + $errorString = WCF.Language.get('wcf.global.form.error.empty'); + break; + + case 'notAffected': + $errorString = WCF.Language.get('wcf.moderation.assignedUser.error.notAffected'); + break; + + default: + $errorString = WCF.Language.get('wcf.user.username.error.' + data.returnValues.errorType, { username: this._dialog.find('#assignedUsername').val() }); + break; + } + + $('' + $errorString + '').insertAfter(this._dialog.find('#assignedUsername')); + + return false; + } + + return true; + }, + + /** + * Submits the assign user form. + */ + _assignUser: function() { + var $assignedUserID = this._dialog.find('input[name=assignedUserID]:checked').val(); + var $assignedUsername = ''; + if ($assignedUserID == -1) { + $assignedUsername = $.trim(this._dialog.find('#assignedUsername').val()); + } + + if ($assignedUserID == -1 && $assignedUsername.length == 0) { + this._dialog.find('small.innerError').remove(); + $('' + WCF.Language.get('wcf.global.form.error.empty') + '').insertAfter(this._dialog.find('#assignedUsername')); + return; + } + + this._proxy.setOption('data', { + actionName: 'assignUser', + className: 'wcf\\data\\moderation\\queue\\ModerationQueueAction', + objectIDs: [ this._queueID ], + parameters: { + assignedUserID: $assignedUserID, + assignedUsername: $assignedUsername + } }); + this._proxy.sendRequest(); } }); diff --git a/wcfsetup/install/files/lib/data/moderation/queue/ModerationQueue.class.php b/wcfsetup/install/files/lib/data/moderation/queue/ModerationQueue.class.php index 5cf33df0b2..cda6d9e606 100644 --- a/wcfsetup/install/files/lib/data/moderation/queue/ModerationQueue.class.php +++ b/wcfsetup/install/files/lib/data/moderation/queue/ModerationQueue.class.php @@ -2,6 +2,7 @@ namespace wcf\data\moderation\queue; use wcf\data\DatabaseObject; use wcf\system\WCF; +use wcf\data\object\type\ObjectTypeCache; /** * Represents a moderation queue entry. @@ -28,6 +29,8 @@ class ModerationQueue extends DatabaseObject { const STATUS_OUTSTANDING = 0; const STATUS_PROCESSING = 1; const STATUS_DONE = 2; + const STATUS_REJECTED = 3; + const STATUS_CONFIRMED = 4; /** * @see \wcf\data\IStorableObject::__get() @@ -85,4 +88,35 @@ class ModerationQueue extends DatabaseObject { public function isDone() { return ($this->status == self::STATUS_DONE); } + + /** + * Returns status text. + * + * @param integer $status + * @return string + */ + public function getStatus($status = null) { + $status = ($status === null) ? $this->status : $status; + switch ($status) { + case self::STATUS_OUTSTANDING: + return WCF::getLanguage()->get('wcf.moderation.status.outstanding'); + break; + + case self::STATUS_PROCESSING: + return WCF::getLanguage()->get('wcf.moderation.status.processing'); + break; + + case self::STATUS_DONE: + return WCF::getLanguage()->get('wcf.moderation.status.done'); + break; + + case self::STATUS_REJECTED: + case self::STATUS_CONFIRMED: + $objectType = ObjectTypeCache::getInstance()->getObjectType($this->objectTypeID); + $definition = ObjectTypeCache::getInstance()->getDefinition($objectType->definitionID); + + return WCF::getLanguage()->get('wcf.moderation.status.' . ($status == self::STATUS_REJECTED ? 'rejected' : 'confirmed') . '.' . $definition->definitionName); + break; + } + } } diff --git a/wcfsetup/install/files/lib/data/moderation/queue/ModerationQueueAction.class.php b/wcfsetup/install/files/lib/data/moderation/queue/ModerationQueueAction.class.php index 15a2b8fd9a..0379b03f84 100644 --- a/wcfsetup/install/files/lib/data/moderation/queue/ModerationQueueAction.class.php +++ b/wcfsetup/install/files/lib/data/moderation/queue/ModerationQueueAction.class.php @@ -1,10 +1,16 @@ $totalCount ); } + + /** + * Validates parameters to show the user assign form. + */ + public function validateGetAssignUserForm() { + $this->moderationQueueEditor = $this->getSingleObject(); + + // check if queue is accessible for current user + if (!$this->moderationQueueEditor->canEdit()) { + throw new PermissionDeniedException(); + } + } + + /** + * Returns the user assign form. + * + * @return array + */ + public function getAssignUserForm() { + $assignedUser = ($this->moderationQueueEditor->assignedUserID) ? new User($this->moderationQueueEditor->assignedUserID) : null; + + WCF::getTPL()->assign(array( + 'assignedUser' => $assignedUser, + 'queue' => $this->moderationQueueEditor + )); + + return array( + 'template' => WCF::getTPL()->fetch('moderationQueueAssignUser') + ); + } + + /** + * Validates parameters to assign a user. + */ + public function validateAssignUser() { + $this->moderationQueueEditor = $this->getSingleObject(); + $this->readInteger('assignedUserID', true); + + if ($this->parameters['assignedUserID'] && $this->parameters['assignedUserID'] != -1) { + if ($this->parameters['assignedUserID'] != WCF::getUser()->userID && $this->parameters['assignedUserID'] != $this->moderationQueueEditor->assignedUserID) { + // user id is either faked or changed during viewing, use database value instead + $this->parameters['assignedUserID'] = $this->moderationQueueEditor->assignedUserID; + } + } + + if ($this->parameters['assignedUserID'] == -1) { + $this->readString('assignedUsername'); + + $this->user = User::getUserByUsername($this->parameters['assignedUsername']); + if (!$this->user->userID) { + throw new UserInputException('assignedUsername', 'notFound'); + } + + // get handler + $objectType = ObjectTypeCache::getInstance()->getObjectType($this->moderationQueueEditor->objectTypeID); + if (!$objectType->getProcessor()->isAffectedUser($this->moderationQueueEditor->getDecoratedObject(), $this->user->userID)) { + throw new UserInputException('assignedUsername', 'notAffected'); + } + + $this->parameters['assignedUserID'] = $this->user->userID; + $this->parameters['assignedUsername'] = ''; + } + else { + $this->user = new User($this->parameters['assignedUserID']); + } + } + + /** + * Returns the data for the newly assigned user. + * + * @return array + */ + public function assignUser() { + $data = array('assignedUserID' => ($this->parameters['assignedUserID'] ?: null)); + if ($this->user->userID) { + if ($this->moderationQueueEditor->status == ModerationQueue::STATUS_OUTSTANDING) { + $data['status'] = ModerationQueue::STATUS_PROCESSING; + } + } + else { + if ($this->moderationQueueEditor->status == ModerationQueue::STATUS_PROCESSING) { + $data['status'] = ModerationQueue::STATUS_OUTSTANDING; + } + } + + $this->moderationQueueEditor->update($data); + + $username = ($this->user->userID) ? $this->user->username : WCF::getLanguage()->get('wcf.moderation.assignedUser.nobody'); + $link = ''; + if ($this->user->userID) { + $link = LinkHandler::getInstance()->getLink('User', array('object' => $this->user)); + } + + $newStatus = ''; + if (isset($data['status'])) { + $newStatus = ($data['status'] == ModerationQueue::STATUS_OUTSTANDING) ? 'outstanding' : 'processing'; + } + + return array( + 'link' => $link, + 'newStatus' => $newStatus, + 'userID' => $this->user->userID, + 'username' => $username + ); + } } diff --git a/wcfsetup/install/files/lib/data/moderation/queue/ModerationQueueActivationAction.class.php b/wcfsetup/install/files/lib/data/moderation/queue/ModerationQueueActivationAction.class.php index 7596fd1560..5f4331b82a 100644 --- a/wcfsetup/install/files/lib/data/moderation/queue/ModerationQueueActivationAction.class.php +++ b/wcfsetup/install/files/lib/data/moderation/queue/ModerationQueueActivationAction.class.php @@ -42,7 +42,7 @@ class ModerationQueueActivationAction extends ModerationQueueAction { // enable content ModerationQueueActivationManager::getInstance()->enableContent($this->queue->getDecoratedObject()); - $this->queue->markAsDone(); + $this->queue->markAsConfirmed(); } /** @@ -60,6 +60,6 @@ class ModerationQueueActivationAction extends ModerationQueueAction { // mark content as deleted ModerationQueueActivationManager::getInstance()->removeContent($this->queue->getDecoratedObject(), $this->parameters['message']); - $this->queue->markAsDone(); + $this->queue->markAsRejected(); } } diff --git a/wcfsetup/install/files/lib/data/moderation/queue/ModerationQueueEditor.class.php b/wcfsetup/install/files/lib/data/moderation/queue/ModerationQueueEditor.class.php index b9f5a3a460..ade397428e 100644 --- a/wcfsetup/install/files/lib/data/moderation/queue/ModerationQueueEditor.class.php +++ b/wcfsetup/install/files/lib/data/moderation/queue/ModerationQueueEditor.class.php @@ -21,6 +21,8 @@ class ModerationQueueEditor extends DatabaseObjectEditor { /** * Marks this entry as done. + * + * @deprecated 2.1 - Please use markAsConfirmed() or markAsRejected() */ public function markAsDone() { $this->update(array('status' => ModerationQueue::STATUS_DONE)); @@ -29,6 +31,27 @@ class ModerationQueueEditor extends DatabaseObjectEditor { ModerationQueueManager::getInstance()->resetModerationCount(); } + /** + * Marks this entry as confirmed, e.g. report was justified and content was deleted or + * content was approved. + */ + public function markAsConfirmed() { + $this->update(array('status' => ModerationQueue::STATUS_CONFIRMED)); + + // reset moderation count + ModerationQueueManager::getInstance()->resetModerationCount(); + } + + /** + * Marks this entry as rejected, e.g. report was unjustified or content approval was denied. + */ + public function markAsRejected() { + $this->update(array('status' => ModerationQueue::STATUS_REJECTED)); + + // reset moderation count + ModerationQueueManager::getInstance()->resetModerationCount(); + } + /** * Marks this entry as in progress. */ diff --git a/wcfsetup/install/files/lib/data/moderation/queue/ModerationQueueReportAction.class.php b/wcfsetup/install/files/lib/data/moderation/queue/ModerationQueueReportAction.class.php index 4a6168bb16..96d637abe7 100644 --- a/wcfsetup/install/files/lib/data/moderation/queue/ModerationQueueReportAction.class.php +++ b/wcfsetup/install/files/lib/data/moderation/queue/ModerationQueueReportAction.class.php @@ -44,7 +44,7 @@ class ModerationQueueReportAction extends ModerationQueueAction { // mark content as deleted ModerationQueueReportManager::getInstance()->removeContent($this->queue->getDecoratedObject(), $this->parameters['message']); - $this->queue->markAsDone(); + $this->queue->markAsConfirmed(); } /** @@ -61,7 +61,7 @@ class ModerationQueueReportAction extends ModerationQueueAction { * Removes this report by marking it as done without further processing. */ public function removeReport() { - $this->queue->markAsDone(); + $this->queue->markAsRejected(); } /** diff --git a/wcfsetup/install/files/lib/form/AbstractModerationForm.class.php b/wcfsetup/install/files/lib/form/AbstractModerationForm.class.php index dfde2b4478..620304ab7e 100644 --- a/wcfsetup/install/files/lib/form/AbstractModerationForm.class.php +++ b/wcfsetup/install/files/lib/form/AbstractModerationForm.class.php @@ -27,18 +27,6 @@ use wcf\util\StringUtil; * @category Community Framework */ abstract class AbstractModerationForm extends AbstractForm { - /** - * assigned user id - * @var integer - */ - public $assignedUserID = 0; - - /** - * assigned user's name - * @var string - */ - public $assignedUsername = ''; - /** * data used for moderation queue update * @var array @@ -102,53 +90,6 @@ abstract class AbstractModerationForm extends AbstractForm { } } - /** - * @see \wcf\form\IForm::readFormParameters() - */ - public function readFormParameters() { - parent::readFormParameters(); - - if (isset($_POST['assignedUsername'])) $this->assignedUsername = StringUtil::trim($_POST['assignedUsername']); - - // verify assigned user id - if (isset($_POST['assignedUserID'])) { - $this->assignedUserID = intval($_POST['assignedUserID']); - if ($this->assignedUserID && $this->assignedUserID != -1) { - if ($this->assignedUserID != WCF::getUser()->userID && $this->assignedUserID != $this->queue->assignedUserID) { - // user id is either faked or changed during viewing, use database value instead - $this->assignedUserID = $this->queue->assignedUserID; - } - } - } - } - - /** - * @see \wcf\form\IForm::validate() - */ - public function validate() { - parent::validate(); - - if ($this->assignedUserID == -1) { - if (empty($this->assignedUsername)) { - throw new UserInputException('assignedUsername'); - } - - $assignedUser = User::getUserByUsername($this->assignedUsername); - if (!$assignedUser->userID) { - throw new UserInputException('assignedUsername', 'notFound'); - } - - // get handler - $objectType = ObjectTypeCache::getInstance()->getObjectType($this->queue->objectTypeID); - if (!$objectType->getProcessor()->isAffectedUser($this->queue->getDecoratedObject(), $assignedUser->userID)) { - throw new UserInputException('assignedUsername', 'notAffected'); - } - - $this->assignedUserID = $assignedUser->userID; - $this->assignedUsername = ''; - } - } - /** * @see \wcf\page\IPage::readData() */ @@ -184,48 +125,10 @@ abstract class AbstractModerationForm extends AbstractForm { 'commentObjectTypeID' => $this->commentObjectTypeID, 'lastCommentTime' => ($this->commentList ? $this->commentList->getMinCommentTime() : 0), 'sidebarCollapsed' => UserCollapsibleContentHandler::getInstance()->isCollapsed('com.woltlab.wcf.collapsibleSidebar', 'com.woltlab.wcf.ModerationForm'), - 'sidebarName' => 'com.woltlab.wcf.ModerationForm', - 'assignedUsername' => $this->assignedUsername + 'sidebarName' => 'com.woltlab.wcf.ModerationForm' )); } - /** - * @see \wcf\form\IForm::save() - */ - public function save() { - parent::save(); - - $this->data = array( - 'assignedUserID' => ($this->assignedUserID ?: null), - ); - if ($this->queue->status != ModerationQueue::STATUS_DONE) { - if ($this->assignedUserID) { - // queue item is being processed - if ($this->assignedUserID != $this->queue->assignedUserID) { - $this->data['status'] = ModerationQueue::STATUS_PROCESSING; - } - } - else { - // queue is no longer processed, mark as outstanding - if ($this->queue->assignedUserID) { - $this->data['status'] = ModerationQueue::STATUS_OUTSTANDING; - } - } - } - - $this->prepareSave(); - $this->objectAction = new ModerationQueueAction(array($this->queue->getDecoratedObject()), 'update', array('data' => $this->data)); - $this->objectAction->executeAction(); - - // call saved event - $this->saved(); - - // reload queue to update assignment - if ($this->assignedUserID != $this->queue->assignedUserID) { - $this->queue = ViewableModerationQueue::getViewableModerationQueue($this->queue->queueID); - } - } - /** * Prepares update of moderation queue item. */ diff --git a/wcfsetup/install/lang/de.xml b/wcfsetup/install/lang/de.xml index 236164f033..d02ef42d5b 100644 --- a/wcfsetup/install/lang/de.xml +++ b/wcfsetup/install/lang/de.xml @@ -2204,6 +2204,8 @@ Fehler sind beispielsweise: + + @@ -2217,7 +2219,12 @@ Fehler sind beispielsweise: + + + + + diff --git a/wcfsetup/install/lang/en.xml b/wcfsetup/install/lang/en.xml index 38e8f87d79..4ac1e6b3bb 100644 --- a/wcfsetup/install/lang/en.xml +++ b/wcfsetup/install/lang/en.xml @@ -2171,6 +2171,8 @@ Errors are: + + @@ -2184,7 +2186,12 @@ Errors are: + + + + + -- 2.20.1