FEATURE: Penalty history improvements (#13359)

* FEATURE: add penalty history when silencing a user

Display penalty history (last 6 months) when silencing/suspending a user

* FEATURE: allow default penalty values to be chosen

Adds a site setting that designates default penalty values in hours.

Silence/suspend modals will auto-fill in the default values, but otherwise
will still allow moderators to pick and overwrite values as normal.

First silence/suspend: first value
Second silence/suspend: second value
etc.

Penalty counts are forgiven at the same rate as tl3 promotion requirements do.

Co-authored-by: jjaffeux <j.jaffeux@gmail.com>
This commit is contained in:
Jeff Wong
2021-07-12 08:36:56 -10:00
committed by GitHub
parent 729a9856f8
commit d87a0216bb
13 changed files with 92 additions and 4 deletions
@@ -0,0 +1,22 @@
import Component from "@ember/component";
import discourseComputed from "discourse-common/utils/decorators";
export default Component.extend({
classNames: ["penalty-history"],
@discourseComputed("user.penalty_counts.suspended")
suspendedCountClass(count) {
if (count > 0) {
return "danger";
}
return "";
},
@discourseComputed("user.penalty_counts.silenced")
silencedCountClass(count) {
if (count > 0) {
return "danger";
}
return "";
},
});
@@ -12,6 +12,10 @@ export default Controller.extend(PenaltyController, {
this.setProperties({ silenceUntil: null, silencing: false });
},
finishedSetup() {
this.set("silenceUntil", this.user?.next_penalty);
},
@discourseComputed("silenceUntil", "reason", "silencing")
submitDisabled(silenceUntil, reason, silencing) {
return silencing || isEmpty(silenceUntil) || !reason || reason.length < 1;
@@ -12,6 +12,10 @@ export default Controller.extend(PenaltyController, {
this.setProperties({ suspendUntil: null, suspending: false });
},
finishedSetup() {
this.set("suspendUntil", this.user?.next_penalty);
},
@discourseComputed("suspendUntil", "reason", "suspending")
submitDisabled(suspendUntil, reason, suspending) {
return suspending || isEmpty(suspendUntil) || !reason || reason.length < 1;
@@ -48,7 +48,6 @@ export default Service.extend({
_showControlModal(type, user, opts) {
opts = opts || {};
let controller = showModal(`admin-${type}-user`, {
admin: true,
modalClass: `${type}-user-modal`,
@@ -65,6 +64,8 @@ export default Service.extend({
before: opts.before,
successCallback: opts.successCallback,
});
controller.finishedSetup();
});
},
@@ -0,0 +1,8 @@
<div class="suspended-count {{suspendedCountClass}}" title={{i18n "admin.user.last_six_months"}}>
<label>{{i18n "admin.user.suspended_count"}}</label>
<span>{{user.penalty_counts.suspended}}</span>
</div>
<div class="silenced-count {{silencedCountClass}}" title={{i18n "admin.user.last_six_months"}}>
<label>{{i18n "admin.user.silenced_count"}}</label>
<span>{{user.penalty_counts.silenced}}</span>
</div>
@@ -5,6 +5,8 @@
<div class="alert alert-error">{{errorMessage}}</div>
{{/if}}
{{admin-penalty-history user=user}}
<div class="until-controls">
<label>
{{future-date-input
@@ -6,6 +6,8 @@
{{/if}}
{{#if user.canSuspend}}
{{admin-penalty-history user=user}}
<div class="until-controls">
<label>
{{future-date-input
@@ -14,9 +14,10 @@ export default Component.extend({
displayLabel: null,
labelClasses: null,
timeInputDisabled: empty("date"),
init() {
this._super(...arguments);
if (this.input) {
const datetime = moment(this.input);
this.setProperties({
@@ -27,8 +28,6 @@ export default Component.extend({
}
},
timeInputDisabled: empty("date"),
@observes("date", "time")
_updateInput() {
if (!this.date) {