1
0
mirror of https://github.com/flarum/core.git synced 2025-08-06 16:36:47 +02:00

Initial commit

This commit is contained in:
Toby Zerner
2015-08-05 16:08:53 +09:30
commit 8c897ceb72
23 changed files with 620 additions and 0 deletions

3
extensions/suspend/js/.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
bower_components
node_modules
dist

View File

@@ -0,0 +1,7 @@
var gulp = require('flarum-gulp');
gulp({
modules: {
'suspend': 'src/**/*.js'
}
});

View File

@@ -0,0 +1,7 @@
{
"private": true,
"devDependencies": {
"gulp": "^3.8.11",
"flarum-gulp": "git+https://github.com/flarum/gulp.git"
}
}

View File

@@ -0,0 +1,6 @@
import { extend } from 'flarum/extend';
import app from 'flarum/app';
app.initializers.add('suspend', () => {
// TODO
});

View File

@@ -0,0 +1,7 @@
var gulp = require('flarum-gulp');
gulp({
modules: {
'suspend': 'src/**/*.js'
}
});

View File

@@ -0,0 +1,7 @@
{
"private": true,
"devDependencies": {
"gulp": "^3.8.11",
"flarum-gulp": "git+https://github.com/flarum/gulp.git"
}
}

View 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();
}
);
}
}

View 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'
}));
}
});
});