mirror of
https://github.com/flarum/core.git
synced 2025-08-06 16:36:47 +02:00
Initial commit
This commit is contained in:
3
extensions/suspend/js/.gitignore
vendored
Normal file
3
extensions/suspend/js/.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
bower_components
|
||||
node_modules
|
||||
dist
|
7
extensions/suspend/js/admin/Gulpfile.js
Normal file
7
extensions/suspend/js/admin/Gulpfile.js
Normal file
@@ -0,0 +1,7 @@
|
||||
var gulp = require('flarum-gulp');
|
||||
|
||||
gulp({
|
||||
modules: {
|
||||
'suspend': 'src/**/*.js'
|
||||
}
|
||||
});
|
7
extensions/suspend/js/admin/package.json
Normal file
7
extensions/suspend/js/admin/package.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"private": true,
|
||||
"devDependencies": {
|
||||
"gulp": "^3.8.11",
|
||||
"flarum-gulp": "git+https://github.com/flarum/gulp.git"
|
||||
}
|
||||
}
|
6
extensions/suspend/js/admin/src/main.js
Normal file
6
extensions/suspend/js/admin/src/main.js
Normal file
@@ -0,0 +1,6 @@
|
||||
import { extend } from 'flarum/extend';
|
||||
import app from 'flarum/app';
|
||||
|
||||
app.initializers.add('suspend', () => {
|
||||
// TODO
|
||||
});
|
7
extensions/suspend/js/forum/Gulpfile.js
Normal file
7
extensions/suspend/js/forum/Gulpfile.js
Normal file
@@ -0,0 +1,7 @@
|
||||
var gulp = require('flarum-gulp');
|
||||
|
||||
gulp({
|
||||
modules: {
|
||||
'suspend': 'src/**/*.js'
|
||||
}
|
||||
});
|
7
extensions/suspend/js/forum/package.json
Normal file
7
extensions/suspend/js/forum/package.json
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"private": true,
|
||||
"devDependencies": {
|
||||
"gulp": "^3.8.11",
|
||||
"flarum-gulp": "git+https://github.com/flarum/gulp.git"
|
||||
}
|
||||
}
|
107
extensions/suspend/js/forum/src/components/SuspendUserModal.js
Normal file
107
extensions/suspend/js/forum/src/components/SuspendUserModal.js
Normal file
@@ -0,0 +1,107 @@
|
||||
import Modal from 'flarum/components/Modal';
|
||||
import Button from 'flarum/components/Button';
|
||||
|
||||
export default class SuspendUserModal extends Modal {
|
||||
constructor(...args) {
|
||||
super(...args);
|
||||
|
||||
let until = this.props.user.suspendUntil();
|
||||
let status = null;
|
||||
|
||||
if (new Date() > until) until = null;
|
||||
|
||||
if (until) {
|
||||
if (until.getFullYear() === 9999) status = 'indefinitely';
|
||||
else status = 'limited';
|
||||
}
|
||||
|
||||
this.status = m.prop(status);
|
||||
this.daysRemaining = m.prop(status === 'limited' && -moment().diff(until, 'days') + 1);
|
||||
}
|
||||
|
||||
className() {
|
||||
return 'SuspendUserModal Modal--small';
|
||||
}
|
||||
|
||||
title() {
|
||||
return 'Suspend ' + this.props.user.username();
|
||||
}
|
||||
|
||||
content() {
|
||||
return (
|
||||
<div className="Modal-body">
|
||||
<div className="Form">
|
||||
<div className="Form-group">
|
||||
<label>Suspension Status</label>
|
||||
<div>
|
||||
<label className="checkbox">
|
||||
<input type="radio" name="status" checked={!this.status()} onclick={m.withAttr('value', this.status)}/>
|
||||
Not suspended
|
||||
</label>
|
||||
|
||||
<label className="checkbox">
|
||||
<input type="radio" name="status" checked={this.status() === 'indefinitely'} value='indefinitely' onclick={m.withAttr('value', this.status)}/>
|
||||
Suspended indefinitely
|
||||
</label>
|
||||
|
||||
<label className="checkbox SuspendUserModal-days">
|
||||
<input type="radio" name="status" checked={this.status() === 'limited'} value='limited' onclick={e => {
|
||||
this.status(e.target.value);
|
||||
m.redraw(true);
|
||||
this.$('.SuspendUserModal-days-input input').select();
|
||||
m.redraw.strategy('none');
|
||||
}}/>
|
||||
Suspended for a limited time...
|
||||
{this.status() === 'limited' ? (
|
||||
<div className="SuspendUserModal-days-input">
|
||||
<input type="number"
|
||||
value={this.daysRemaining()}
|
||||
oninput={m.withAttr('value', this.daysRemaining)}
|
||||
className="FormControl"/>
|
||||
{' days'}
|
||||
</div>
|
||||
) : ''}
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div className="Form-group">
|
||||
{Button.component({
|
||||
children: 'Save Changes',
|
||||
className: 'Button Button--primary',
|
||||
loading: this.loading
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
onsubmit(e) {
|
||||
e.preventDefault();
|
||||
|
||||
this.loading = true;
|
||||
|
||||
let suspendUntil = null;
|
||||
switch (this.status()) {
|
||||
case 'indefinitely':
|
||||
suspendUntil = new Date('9999-12-31');
|
||||
break;
|
||||
|
||||
case 'limited':
|
||||
suspendUntil = moment().add(this.daysRemaining(), 'days').toDate();
|
||||
break;
|
||||
|
||||
default:
|
||||
// no default
|
||||
}
|
||||
|
||||
this.props.user.save({suspendUntil}).then(
|
||||
() => this.hide(),
|
||||
() => {
|
||||
this.loading = false;
|
||||
m.redraw();
|
||||
}
|
||||
);
|
||||
}
|
||||
}
|
36
extensions/suspend/js/forum/src/main.js
Normal file
36
extensions/suspend/js/forum/src/main.js
Normal file
@@ -0,0 +1,36 @@
|
||||
import { extend } from 'flarum/extend';
|
||||
import app from 'flarum/app';
|
||||
import UserControls from 'flarum/utils/UserControls';
|
||||
import Button from 'flarum/components/Button';
|
||||
import Badge from 'flarum/components/Badge';
|
||||
import Model from 'flarum/Model';
|
||||
import User from 'flarum/models/User';
|
||||
|
||||
import SuspendUserModal from 'suspend/components/SuspendUserModal';
|
||||
|
||||
app.initializers.add('suspend', () => {
|
||||
User.prototype.canSuspend = Model.attribute('canSuspend');
|
||||
User.prototype.suspendUntil = Model.attribute('suspendUntil', Model.transformDate);
|
||||
|
||||
extend(UserControls, 'moderationControls', (items, user) => {
|
||||
if (user.canSuspend()) {
|
||||
items.add('suspend', Button.component({
|
||||
children: 'Suspend',
|
||||
icon: 'shield',
|
||||
onclick: () => app.modal.show(new SuspendUserModal({user}))
|
||||
}));
|
||||
}
|
||||
});
|
||||
|
||||
extend(User.prototype, 'badges', function(items) {
|
||||
const until = this.suspendUntil();
|
||||
|
||||
if (new Date() < until) {
|
||||
items.add('suspended', Badge.component({
|
||||
icon: 'times',
|
||||
type: 'suspended',
|
||||
label: 'Suspended'
|
||||
}));
|
||||
}
|
||||
});
|
||||
});
|
Reference in New Issue
Block a user