diff --git a/extensions/flags/bootstrap.php b/extensions/flags/bootstrap.php
index c296e3d99..94022d5ec 100644
--- a/extensions/flags/bootstrap.php
+++ b/extensions/flags/bootstrap.php
@@ -11,4 +11,4 @@
require __DIR__.'/vendor/autoload.php';
-return 'Flarum\Reports\Extension';
+return 'Flarum\Flags\Extension';
diff --git a/extensions/flags/composer.json b/extensions/flags/composer.json
index 374a4871c..e0f25d883 100644
--- a/extensions/flags/composer.json
+++ b/extensions/flags/composer.json
@@ -1,7 +1,7 @@
{
"autoload": {
"psr-4": {
- "Flarum\\Reports\\": "src/"
+ "Flarum\\Flags\\": "src/"
}
},
"scripts": {
diff --git a/extensions/flags/flarum.json b/extensions/flags/flarum.json
index de9b3c06c..2b789d6bb 100644
--- a/extensions/flags/flarum.json
+++ b/extensions/flags/flarum.json
@@ -1,7 +1,7 @@
{
- "name": "reports",
- "title": "Reports",
- "description": "Allow users to report posts for moderator review.",
+ "name": "flags",
+ "title": "Flags",
+ "description": "Allow users to flag posts for moderator review.",
"keywords": [],
"version": "0.1.0-beta.2",
"author": {
@@ -14,7 +14,7 @@
"flarum": ">=0.1.0-beta.2"
},
"support": {
- "source": "https://github.com/flarum/reports",
+ "source": "https://github.com/flarum/flags",
"issues": "https://github.com/flarum/core/issues"
},
"icon": {
diff --git a/extensions/flags/js/admin/Gulpfile.js b/extensions/flags/js/admin/Gulpfile.js
index 9db4f9477..bde8f8aef 100644
--- a/extensions/flags/js/admin/Gulpfile.js
+++ b/extensions/flags/js/admin/Gulpfile.js
@@ -2,6 +2,6 @@ var gulp = require('flarum-gulp');
gulp({
modules: {
- 'reports': 'src/**/*.js'
+ 'flags': 'src/**/*.js'
}
});
diff --git a/extensions/flags/js/admin/src/main.js b/extensions/flags/js/admin/src/main.js
index 8b72ed4fa..ab8dc655e 100644
--- a/extensions/flags/js/admin/src/main.js
+++ b/extensions/flags/js/admin/src/main.js
@@ -2,18 +2,20 @@ import { extend } from 'flarum/extend';
import app from 'flarum/app';
import PermissionGrid from 'flarum/components/PermissionGrid';
-app.initializers.add('reports', () => {
+app.initializers.add('flags', () => {
extend(PermissionGrid.prototype, 'moderateItems', items => {
- items.add('viewReports', {
- label: 'View reported posts',
- permission: 'discussion.viewReports'
- });
+ items.add('viewFlags', {
+ icon: 'flag',
+ label: 'View flagged posts',
+ permission: 'discussion.viewFlags'
+ }, 65);
});
extend(PermissionGrid.prototype, 'replyItems', items => {
- items.add('reportPosts', {
- label: 'Report posts',
- permission: 'discussion.reportPosts'
- });
+ items.add('flagPosts', {
+ icon: 'flag',
+ label: 'Flag posts',
+ permission: 'discussion.flagPosts'
+ }, 70);
});
});
diff --git a/extensions/flags/js/forum/Gulpfile.js b/extensions/flags/js/forum/Gulpfile.js
index 9db4f9477..bde8f8aef 100644
--- a/extensions/flags/js/forum/Gulpfile.js
+++ b/extensions/flags/js/forum/Gulpfile.js
@@ -2,6 +2,6 @@ var gulp = require('flarum-gulp');
gulp({
modules: {
- 'reports': 'src/**/*.js'
+ 'flags': 'src/**/*.js'
}
});
diff --git a/extensions/flags/js/forum/src/addReportControl.js b/extensions/flags/js/forum/src/addFlagControl.js
similarity index 57%
rename from extensions/flags/js/forum/src/addReportControl.js
rename to extensions/flags/js/forum/src/addFlagControl.js
index ae3f4aa46..98672af61 100644
--- a/extensions/flags/js/forum/src/addReportControl.js
+++ b/extensions/flags/js/forum/src/addFlagControl.js
@@ -3,14 +3,14 @@ import app from 'flarum/app';
import PostControls from 'flarum/utils/PostControls';
import Button from 'flarum/components/Button';
-import ReportPostModal from 'reports/components/ReportPostModal';
+import FlagPostModal from 'flags/components/FlagPostModal';
export default function() {
extend(PostControls, 'userControls', function(items, post) {
- if (post.isHidden() || post.contentType() !== 'comment' || !post.canReport() || post.user() === app.session.user) return;
+ if (post.isHidden() || post.contentType() !== 'comment' || !post.canFlag() || post.user() === app.session.user) return;
- items.add('report',
-
+ items.add('flag',
+
);
});
}
diff --git a/extensions/flags/js/forum/src/addReportsDropdown.js b/extensions/flags/js/forum/src/addFlagsDropdown.js
similarity index 59%
rename from extensions/flags/js/forum/src/addReportsDropdown.js
rename to extensions/flags/js/forum/src/addFlagsDropdown.js
index f887ba722..af0520e7a 100644
--- a/extensions/flags/js/forum/src/addReportsDropdown.js
+++ b/extensions/flags/js/forum/src/addFlagsDropdown.js
@@ -1,12 +1,12 @@
import { extend } from 'flarum/extend';
import app from 'flarum/app';
import HeaderSecondary from 'flarum/components/HeaderSecondary';
-import ReportsDropdown from 'reports/components/ReportsDropdown';
+import FlagsDropdown from 'flags/components/FlagsDropdown';
export default function() {
extend(HeaderSecondary.prototype, 'items', function(items) {
- if (app.forum.attribute('canViewReports')) {
- items.add('reports', , 15);
+ if (app.forum.attribute('canViewFlags')) {
+ items.add('flags', , 15);
}
});
}
diff --git a/extensions/flags/js/forum/src/addFlagsToPosts.js b/extensions/flags/js/forum/src/addFlagsToPosts.js
new file mode 100644
index 000000000..98f5f7b61
--- /dev/null
+++ b/extensions/flags/js/forum/src/addFlagsToPosts.js
@@ -0,0 +1,109 @@
+import { extend } from 'flarum/extend';
+import app from 'flarum/app';
+import CommentPost from 'flarum/components/CommentPost';
+import Button from 'flarum/components/Button';
+import punctuate from 'flarum/helpers/punctuate';
+import username from 'flarum/helpers/username';
+import ItemList from 'flarum/utils/ItemList';
+import PostControls from 'flarum/utils/PostControls';
+
+export default function() {
+ extend(CommentPost.prototype, 'attrs', function(attrs) {
+ if (this.props.post.flags().length) {
+ attrs.className += ' Post--flagged';
+ }
+ });
+
+ CommentPost.prototype.dismissFlag = function(data) {
+ const post = this.props.post;
+
+ delete post.data.relationships.flags;
+
+ this.subtree.invalidate();
+
+ if (app.cache.flags) {
+ app.cache.flags.some((flag, i) => {
+ if (flag.post() === post) {
+ app.cache.flags.splice(i, 1);
+
+ if (app.cache.flagIndex === post) {
+ let next = app.cache.flags[i];
+
+ if (!next) next = app.cache.flags[0];
+
+ if (next) {
+ const nextPost = next.post();
+ app.cache.flagIndex = nextPost;
+ m.route(app.route.post(nextPost));
+ }
+ }
+
+ return true;
+ }
+ });
+ }
+
+ return app.request({
+ url: app.forum.attribute('apiUrl') + post.apiEndpoint() + '/flags',
+ method: 'DELETE',
+ data
+ });
+ };
+
+ CommentPost.prototype.flagActionItems = function() {
+ const items = new ItemList();
+
+ const controls = PostControls.destructiveControls(this.props.post);
+
+ Object.keys(controls).forEach(k => {
+ const props = controls[k].content.props;
+
+ props.className = 'Button';
+
+ extend(props, 'onclick', () => this.dismissFlag());
+ });
+
+ items.merge(controls);
+
+ items.add('dismiss', , -100);
+
+ return items;
+ };
+
+ extend(CommentPost.prototype, 'content', function(vdom) {
+ const post = this.props.post;
+ const flags = post.flags();
+
+ if (!flags.length) return;
+
+ if (post.isHidden()) this.revealContent = true;
+
+ vdom.unshift(
+
+
+ {flags.map(flag =>
+
+ {this.flagReason(flag)}
+
+ )}
+
+
+ {this.flagActionItems().toArray()}
+
+
+ );
+ });
+
+ CommentPost.prototype.flagReason = function(flag) {
+ if (flag.type() === 'user') {
+ const user = flag.user();
+ const reason = flag.reason();
+ const detail = flag.reasonDetail();
+
+ return [
+ app.trans(reason ? 'flags.flagged_by_with_reason' : 'flags.flagged_by', {user, reason}),
+ detail ? {detail} : ''
+ ];
+ }
+ };
+}
diff --git a/extensions/flags/js/forum/src/addReportsToPosts.js b/extensions/flags/js/forum/src/addReportsToPosts.js
deleted file mode 100644
index bc35d0ed4..000000000
--- a/extensions/flags/js/forum/src/addReportsToPosts.js
+++ /dev/null
@@ -1,134 +0,0 @@
-import { extend } from 'flarum/extend';
-import app from 'flarum/app';
-import CommentPost from 'flarum/components/CommentPost';
-import Button from 'flarum/components/Button';
-import punctuate from 'flarum/helpers/punctuate';
-import username from 'flarum/helpers/username';
-import ItemList from 'flarum/utils/ItemList';
-import PostControls from 'flarum/utils/PostControls';
-
-export default function() {
- extend(CommentPost.prototype, 'attrs', function(attrs) {
- if (this.props.post.reports().length) {
- attrs.className += ' Post--reported';
- }
- });
-
- CommentPost.prototype.dismissReport = function(data) {
- const post = this.props.post;
-
- delete post.data.relationships.reports;
-
- this.subtree.invalidate();
-
- if (app.cache.reports) {
- app.cache.reports.some((report, i) => {
- if (report.post() === post) {
- app.cache.reports.splice(i, 1);
-
- if (app.cache.reportIndex === post) {
- let next = app.cache.reports[i];
-
- if (!next) next = app.cache.reports[0];
-
- if (next) {
- const nextPost = next.post();
- app.cache.reportIndex = nextPost;
- m.route(app.route.post(nextPost));
- }
- }
-
- return true;
- }
- });
- }
-
- return app.request({
- url: app.forum.attribute('apiUrl') + post.apiEndpoint() + '/reports',
- method: 'DELETE',
- data
- });
- };
-
- CommentPost.prototype.reportActionItems = function() {
- const items = new ItemList();
-
- if (this.props.post.isHidden()) {
- if (this.props.post.canDelete()) {
- items.add('delete',
- ,
- 100
- );
- }
- } else {
- items.add('hide',
- ,
- 100
- );
- }
-
- items.add('dismiss', , -100);
-
- return items;
- };
-
- extend(CommentPost.prototype, 'content', function(vdom) {
- const post = this.props.post;
- const reports = post.reports();
-
- if (!reports.length) return;
-
- if (post.isHidden()) this.revealContent = true;
-
- const users = reports.map(report => {
- const user = report.user();
-
- return user
- ? {username(user)}
- : report.reporter();
- });
-
- const usedReasons = [];
- const reasons = reports.map(report => report.reason()).filter(reason => {
- if (reason && usedReasons.indexOf(reason) === -1) {
- usedReasons.push(reason);
- return true;
- }
- });
-
- const details = reports.map(report => report.reasonDetail()).filter(detail => detail);
-
- vdom.unshift(
-
-
- {app.trans(reasons.length ? 'reports.reported_by_with_reason' : 'reports.reported_by', {
- reasons: punctuate(reasons.map(reason => app.trans('reports.reason_' + reason, undefined, reason))),
- users: punctuate(users)
- })}
- {details.map(detail =>
{detail}
)}
-
-
- {this.reportActionItems().toArray()}
-
-
- );
- });
-}
diff --git a/extensions/flags/js/forum/src/components/ReportList.js b/extensions/flags/js/forum/src/components/FlagList.js
similarity index 70%
rename from extensions/flags/js/forum/src/components/ReportList.js
rename to extensions/flags/js/forum/src/components/FlagList.js
index 7cb0f483b..6ced95ef0 100644
--- a/extensions/flags/js/forum/src/components/ReportList.js
+++ b/extensions/flags/js/forum/src/components/FlagList.js
@@ -5,7 +5,7 @@ import username from 'flarum/helpers/username';
import icon from 'flarum/helpers/icon';
import humanTime from 'flarum/helpers/humanTime';
-export default class ReportList extends Component {
+export default class FlagList extends Component {
constructor(...args) {
super(...args);
@@ -18,32 +18,32 @@ export default class ReportList extends Component {
}
view() {
- const reports = app.cache.reports || [];
+ const flags = app.cache.flags || [];
return (
-
+
-
Reported Posts
+ Flagged Posts
@@ -61,20 +61,20 @@ export default class ReportList extends Component {
}
/**
- * Load reports into the application's cache if they haven't already
+ * Load flags into the application's cache if they haven't already
* been loaded.
*/
load() {
- if (app.cache.reports && !app.forum.attribute('unreadReportsCount')) {
+ if (app.cache.flags && !app.forum.attribute('unreadFlagsCount')) {
return;
}
this.loading = true;
m.redraw();
- app.store.find('reports').then(reports => {
- app.forum.pushAttributes({unreadReportsCount: 0});
- app.cache.reports = reports.sort((a, b) => b.time() - a.time());
+ app.store.find('flags').then(flags => {
+ app.forum.pushAttributes({unreadFlagsCount: 0});
+ app.cache.flags = flags.sort((a, b) => b.time() - a.time());
this.loading = false;
m.redraw();
diff --git a/extensions/flags/js/forum/src/components/ReportPostModal.js b/extensions/flags/js/forum/src/components/FlagPostModal.js
similarity index 92%
rename from extensions/flags/js/forum/src/components/ReportPostModal.js
rename to extensions/flags/js/forum/src/components/FlagPostModal.js
index 61433e5a6..f6f4662e5 100644
--- a/extensions/flags/js/forum/src/components/ReportPostModal.js
+++ b/extensions/flags/js/forum/src/components/FlagPostModal.js
@@ -1,7 +1,7 @@
import Modal from 'flarum/components/Modal';
import Button from 'flarum/components/Button';
-export default class ReportPostModal extends Modal {
+export default class FlagPostModal extends Modal {
constructor(...args) {
super(...args);
@@ -10,11 +10,11 @@ export default class ReportPostModal extends Modal {
}
className() {
- return 'ReportPostModal Modal--small';
+ return 'FlagPostModal Modal--small';
}
title() {
- return 'Report Post';
+ return 'Flag Post';
}
content() {
@@ -55,7 +55,7 @@ export default class ReportPostModal extends Modal {
type="submit"
loading={this.loading}
disabled={!this.reason()}>
- Report Post
+ Flag Post
@@ -68,7 +68,7 @@ export default class ReportPostModal extends Modal {
this.loading = true;
- app.store.createRecord('reports').save({
+ app.store.createRecord('flags').save({
reason: this.reason() === 'other' ? null : this.reason(),
reasonDetail: this.reasonDetail(),
relationships: {
diff --git a/extensions/flags/js/forum/src/components/FlagsDropdown.js b/extensions/flags/js/forum/src/components/FlagsDropdown.js
new file mode 100644
index 000000000..5f0ae934d
--- /dev/null
+++ b/extensions/flags/js/forum/src/components/FlagsDropdown.js
@@ -0,0 +1,26 @@
+import NotificationsDropdown from 'flarum/components/NotificationsDropdown';
+
+import FlagList from 'flags/components/FlagList';
+
+export default class FlagsDropdown extends NotificationsDropdown {
+ static initProps(props) {
+ props.label = props.label || 'Flagged Posts';
+ props.icon = props.icon || 'flag';
+
+ super.initProps(props);
+ }
+
+ constructor(...args) {
+ super(...args);
+
+ this.list = new FlagList();
+ }
+
+ goToRoute() {
+ m.route(app.route('flags'));
+ }
+
+ getUnreadCount() {
+ return app.forum.attribute('unreadFlagsCount');
+ }
+}
diff --git a/extensions/flags/js/forum/src/components/FlagsPage.js b/extensions/flags/js/forum/src/components/FlagsPage.js
new file mode 100644
index 000000000..a3ed2a747
--- /dev/null
+++ b/extensions/flags/js/forum/src/components/FlagsPage.js
@@ -0,0 +1,24 @@
+import Page from 'flarum/components/Page';
+
+import FlagList from 'flags/components/FlagList';
+
+/**
+ * The `FlagsPage` component shows the flags list. It is only
+ * used on mobile devices where the flags dropdown is within the drawer.
+ */
+export default class FlagsPage extends Page {
+ constructor(...args) {
+ super(...args);
+
+ app.history.push('flags');
+
+ this.list = new FlagList();
+ this.list.load();
+
+ this.bodyClass = 'App--flags';
+ }
+
+ view() {
+ return {this.list.render()}
;
+ }
+}
diff --git a/extensions/flags/js/forum/src/components/ReportsDropdown.js b/extensions/flags/js/forum/src/components/ReportsDropdown.js
deleted file mode 100644
index 8aadb271a..000000000
--- a/extensions/flags/js/forum/src/components/ReportsDropdown.js
+++ /dev/null
@@ -1,26 +0,0 @@
-import NotificationsDropdown from 'flarum/components/NotificationsDropdown';
-
-import ReportList from 'reports/components/ReportList';
-
-export default class ReportsDropdown extends NotificationsDropdown {
- static initProps(props) {
- props.label = props.label || 'Reports';
- props.icon = props.icon || 'flag';
-
- super.initProps(props);
- }
-
- constructor(...args) {
- super(...args);
-
- this.list = new ReportList();
- }
-
- goToRoute() {
- m.route(app.route('reports'));
- }
-
- getUnreadCount() {
- return app.forum.attribute('unreadReportsCount');
- }
-}
diff --git a/extensions/flags/js/forum/src/components/ReportsPage.js b/extensions/flags/js/forum/src/components/ReportsPage.js
deleted file mode 100644
index e588496f5..000000000
--- a/extensions/flags/js/forum/src/components/ReportsPage.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import Page from 'flarum/components/Page';
-
-import ReportList from 'reports/components/ReportList';
-
-/**
- * The `ReportsPage` component shows the reports list. It is only
- * used on mobile devices where the reports dropdown is within the drawer.
- */
-export default class ReportsPage extends Page {
- constructor(...args) {
- super(...args);
-
- app.history.push('reports');
-
- this.list = new ReportList();
- this.list.load();
-
- this.bodyClass = 'App--reports';
- }
-
- view() {
- return {this.list.render()}
;
- }
-}
diff --git a/extensions/flags/js/forum/src/main.js b/extensions/flags/js/forum/src/main.js
index 19256b252..d07832d2d 100644
--- a/extensions/flags/js/forum/src/main.js
+++ b/extensions/flags/js/forum/src/main.js
@@ -1,21 +1,21 @@
import app from 'flarum/app';
import Model from 'flarum/Model';
-import Report from 'reports/models/Report';
-import ReportsPage from 'reports/components/ReportsPage';
-import addReportControl from 'reports/addReportControl';
-import addReportsDropdown from 'reports/addReportsDropdown';
-import addReportsToPosts from 'reports/addReportsToPosts';
+import Flag from 'flags/models/Flag';
+import FlagsPage from 'flags/components/FlagsPage';
+import addFlagControl from 'flags/addFlagControl';
+import addFlagsDropdown from 'flags/addFlagsDropdown';
+import addFlagsToPosts from 'flags/addFlagsToPosts';
-app.initializers.add('reports', () => {
- app.store.models.posts.prototype.reports = Model.hasMany('reports');
- app.store.models.posts.prototype.canReport = Model.attribute('canReport');
+app.initializers.add('flags', () => {
+ app.store.models.posts.prototype.flags = Model.hasMany('flags');
+ app.store.models.posts.prototype.canFlag = Model.attribute('canFlag');
- app.store.models.reports = Report;
+ app.store.models.flags = Flag;
- app.routes.reports = {path: '/reports', component: };
+ app.routes.flags = {path: '/flags', component: };
- addReportControl();
- addReportsDropdown();
- addReportsToPosts();
+ addFlagControl();
+ addFlagsDropdown();
+ addFlagsToPosts();
});
diff --git a/extensions/flags/js/forum/src/models/Report.js b/extensions/flags/js/forum/src/models/Flag.js
similarity index 75%
rename from extensions/flags/js/forum/src/models/Report.js
rename to extensions/flags/js/forum/src/models/Flag.js
index f539cc42f..7a92014bc 100644
--- a/extensions/flags/js/forum/src/models/Report.js
+++ b/extensions/flags/js/forum/src/models/Flag.js
@@ -1,8 +1,8 @@
import Model from 'flarum/Model';
import mixin from 'flarum/utils/mixin';
-export default class Report extends mixin(Model, {
- reporter: Model.attribute('reporter'),
+export default class Flag extends mixin(Model, {
+ type: Model.attribute('type'),
reason: Model.attribute('reason'),
reasonDetail: Model.attribute('reasonDetail'),
time: Model.attribute('time', Model.transformDate),
diff --git a/extensions/flags/less/forum/extension.less b/extensions/flags/less/forum/extension.less
index de200fa8a..c5afee076 100644
--- a/extensions/flags/less/forum/extension.less
+++ b/extensions/flags/less/forum/extension.less
@@ -1,34 +1,32 @@
-.Post--reported {
+.Post--flagged {
padding-top: 0 !important;
border: 2px solid @primary-color;
}
-.Post-header .item-reported {
+.Post-header .item-flagged {
display: block;
margin: 0;
}
-.Post-reported {
+.Post-flagged {
background: @primary-color;
margin-top: -2px;
margin-bottom: 20px;
margin-left: -22px;
margin-right: -22px;
-
- @media @tablet-up {
- margin-left: -22px - 85px;
- text-align: right;
- }
-
padding: 10px;
border-radius: @border-radius @border-radius 0 0;
overflow: hidden;
.light-contents(@color: @body-bg; @control-color: @body-bg);
+ @media @tablet-up {
+ margin-left: -22px - 85px;
+ }
+
&, a {
color: @body-bg !important;
}
}
-.Post-reported-summary {
+.Post-flagged-flags {
@media @tablet-up {
float: left;
}
@@ -38,16 +36,21 @@
text-align: left;
font-weight: bold;
}
-.Post-reported-detail {
+.Post-flagged-detail {
font-size: 12px;
- margin-top: 5px;
+ margin-left: 10px;
font-weight: normal;
}
-.Post-reported-actions .Button {
+.Post-flagged-actions {
+ @media @tablet-up {
+ float: right;
+ }
+}
+.Post-flagged-actions .Button {
margin-left: 5px;
}
-.ReportsDropdown .Dropdown-toggle {
+.FlagsDropdown .Dropdown-toggle {
.Button-label,
.Button-caret {
display: none;
diff --git a/extensions/flags/locale/en.yml b/extensions/flags/locale/en.yml
index 3a43bcf5c..339682422 100644
--- a/extensions/flags/locale/en.yml
+++ b/extensions/flags/locale/en.yml
@@ -1,8 +1,8 @@
-reports:
+flags:
reason_off_topic: Off-topic
reason_spam: Spam
reason_inappropriate: Inappropriate
reason_other: Other
- reported_by: "Reported by {users}"
- reported_by_with_reason: "Reported as {reasons} by {users}"
- no_reports: No Reports
+ flagged_by: "{username} flagged"
+ flagged_by_with_reason: "{username} flagged as {reason}"
+ no_flags: No Flags
diff --git a/extensions/flags/migrations/2015_09_02_000000_add_reports_read_time_to_users_table.php b/extensions/flags/migrations/2015_09_02_000000_add_flags_read_time_to_users_table.php
similarity index 69%
rename from extensions/flags/migrations/2015_09_02_000000_add_reports_read_time_to_users_table.php
rename to extensions/flags/migrations/2015_09_02_000000_add_flags_read_time_to_users_table.php
index 4db92ffa3..a3161daeb 100644
--- a/extensions/flags/migrations/2015_09_02_000000_add_reports_read_time_to_users_table.php
+++ b/extensions/flags/migrations/2015_09_02_000000_add_flags_read_time_to_users_table.php
@@ -8,22 +8,22 @@
* file that was distributed with this source code.
*/
-namespace Flarum\Migrations\Reports;
+namespace Flarum\Migrations\Flags;
use Illuminate\Database\Schema\Blueprint;
use Flarum\Migrations\Migration;
-class AddReportsReadTimeToUsersTable extends Migration
+class AddFlagsReadTimeToUsersTable extends Migration
{
public function up()
{
$this->schema->table('users', function (Blueprint $table) {
- $table->dateTime('reports_read_time')->nullable();
+ $table->dateTime('flags_read_time')->nullable();
});
}
public function down()
{
- $this->schema->drop('reports_read_time');
+ $this->schema->drop('flags_read_time');
}
}
diff --git a/extensions/flags/migrations/2015_09_02_000000_create_reports_table.php b/extensions/flags/migrations/2015_09_02_000000_create_flags_table.php
similarity index 68%
rename from extensions/flags/migrations/2015_09_02_000000_create_reports_table.php
rename to extensions/flags/migrations/2015_09_02_000000_create_flags_table.php
index 84b4d25a4..7c23f9a20 100644
--- a/extensions/flags/migrations/2015_09_02_000000_create_reports_table.php
+++ b/extensions/flags/migrations/2015_09_02_000000_create_flags_table.php
@@ -8,20 +8,20 @@
* file that was distributed with this source code.
*/
-namespace Flarum\Migrations\Reports;
+namespace Flarum\Migrations\Flags;
use Illuminate\Database\Schema\Blueprint;
use Flarum\Migrations\Migration;
-class CreateReportsTable extends Migration
+class CreateFlagsTable extends Migration
{
public function up()
{
- $this->schema->create('reports', function (Blueprint $table) {
+ $this->schema->create('flags', function (Blueprint $table) {
$table->increments('id');
$table->integer('post_id')->unsigned();
- $table->integer('user_id')->unsigned();
- $table->string('reporter')->nullable();
+ $table->string('type');
+ $table->integer('user_id')->unsigned()->nullable();
$table->string('reason')->nullable();
$table->string('reason_detail')->nullable();
$table->dateTime('time');
@@ -30,6 +30,6 @@ class CreateReportsTable extends Migration
public function down()
{
- $this->schema->drop('reports');
+ $this->schema->drop('flags');
}
}
diff --git a/extensions/flags/src/Api/CreateAction.php b/extensions/flags/src/Api/CreateAction.php
index d9c3a2d62..8eb3d61bf 100644
--- a/extensions/flags/src/Api/CreateAction.php
+++ b/extensions/flags/src/Api/CreateAction.php
@@ -1,4 +1,4 @@
- true,
- 'post.reports' => true
+ 'post.flags' => true
];
/**
@@ -44,15 +44,15 @@ class CreateAction extends BaseCreateAction
}
/**
- * Create a report according to input from the API request.
+ * Create a flag according to input from the API request.
*
* @param JsonApiRequest $request
- * @return \Flarum\Reports\Report
+ * @return \Flarum\Flags\Flag
*/
protected function create(JsonApiRequest $request)
{
return $this->bus->dispatch(
- new CreateReport($request->actor, $request->get('data'))
+ new CreateFlag($request->actor, $request->get('data'))
);
}
}
diff --git a/extensions/flags/src/Api/DeleteAction.php b/extensions/flags/src/Api/DeleteAction.php
index 90c527a86..7621da62b 100644
--- a/extensions/flags/src/Api/DeleteAction.php
+++ b/extensions/flags/src/Api/DeleteAction.php
@@ -1,4 +1,4 @@
-bus->dispatch(
- new DeleteReports($request->get('id'), $request->actor, $request->all())
+ new DeleteFlags($request->get('id'), $request->actor, $request->all())
);
}
}
diff --git a/extensions/flags/src/Api/ReportSerializer.php b/extensions/flags/src/Api/FlagSerializer.php
similarity index 62%
rename from extensions/flags/src/Api/ReportSerializer.php
rename to extensions/flags/src/Api/FlagSerializer.php
index 8d05a536c..7604197e9 100644
--- a/extensions/flags/src/Api/ReportSerializer.php
+++ b/extensions/flags/src/Api/FlagSerializer.php
@@ -1,4 +1,4 @@
- $report->reporter,
- 'reason' => $report->reason,
- 'reasonDetail' => $report->reason_detail,
+ 'type' => $flag->type,
+ 'reason' => $flag->reason,
+ 'reasonDetail' => $flag->reason_detail,
];
}
diff --git a/extensions/flags/src/Api/IndexAction.php b/extensions/flags/src/Api/IndexAction.php
index 8c39f3857..12d7d6e85 100644
--- a/extensions/flags/src/Api/IndexAction.php
+++ b/extensions/flags/src/Api/IndexAction.php
@@ -1,4 +1,4 @@
-actor;
- $actor->reports_read_time = time();
+ $actor->flags_read_time = time();
$actor->save();
- return Report::whereVisibleTo($actor)
+ return Flag::whereVisibleTo($actor)
->with($request->include)
- ->latest('reports.time')
+ ->latest('flags.time')
->groupBy('post_id')
->get();
}
diff --git a/extensions/flags/src/Commands/CreateReport.php b/extensions/flags/src/Commands/CreateFlag.php
similarity index 79%
rename from extensions/flags/src/Commands/CreateReport.php
rename to extensions/flags/src/Commands/CreateFlag.php
index 92c1ae2cf..204010f82 100644
--- a/extensions/flags/src/Commands/CreateReport.php
+++ b/extensions/flags/src/Commands/CreateFlag.php
@@ -1,4 +1,4 @@
-actor;
$data = $command->data;
@@ -41,23 +41,24 @@ class CreateReportHandler
throw new Exception;
}
- $post->assertCan($actor, 'report');
+ $post->assertCan($actor, 'flag');
- Report::unguard();
+ Flag::unguard();
- $report = Report::firstOrNew([
+ $flag = Flag::firstOrNew([
'post_id' => $post->id,
'user_id' => $actor->id
]);
- $report->post_id = $post->id;
- $report->user_id = $actor->id;
- $report->reason = array_get($data, 'attributes.reason');
- $report->reason_detail = array_get($data, 'attributes.reasonDetail');
- $report->time = time();
+ $flag->post_id = $post->id;
+ $flag->user_id = $actor->id;
+ $flag->type = 'user';
+ $flag->reason = array_get($data, 'attributes.reason');
+ $flag->reason_detail = array_get($data, 'attributes.reasonDetail');
+ $flag->time = time();
- $report->save();
+ $flag->save();
- return $report;
+ return $flag;
}
}
diff --git a/extensions/flags/src/Commands/DeleteReports.php b/extensions/flags/src/Commands/DeleteFlags.php
similarity index 78%
rename from extensions/flags/src/Commands/DeleteReports.php
rename to extensions/flags/src/Commands/DeleteFlags.php
index e1ffd6b09..2f70fb6aa 100644
--- a/extensions/flags/src/Commands/DeleteReports.php
+++ b/extensions/flags/src/Commands/DeleteFlags.php
@@ -1,4 +1,4 @@
-actor;
$post = $this->posts->findOrFail($command->postId, $actor);
- $post->discussion->assertCan($actor, 'viewReports');
+ $post->discussion->assertCan($actor, 'viewFlags');
- event(new ReportsWillBeDeleted($post, $actor, $command->data));
+ event(new FlagsWillBeDeleted($post, $actor, $command->data));
- $post->reports()->delete();
+ $post->flags()->delete();
return $post;
}
diff --git a/extensions/flags/src/Events/ReportsWillBeDeleted.php b/extensions/flags/src/Events/FlagsWillBeDeleted.php
similarity index 92%
rename from extensions/flags/src/Events/ReportsWillBeDeleted.php
rename to extensions/flags/src/Events/FlagsWillBeDeleted.php
index 92dafe6a9..b824c662a 100644
--- a/extensions/flags/src/Events/ReportsWillBeDeleted.php
+++ b/extensions/flags/src/Events/FlagsWillBeDeleted.php
@@ -9,12 +9,12 @@
* file that was distributed with this source code.
*/
-namespace Flarum\Reports\Events;
+namespace Flarum\Flags\Events;
use Flarum\Core\Posts\Post;
use Flarum\Core\Users\User;
-class ReportsWillBeDeleted
+class FlagsWillBeDeleted
{
/**
* @var Post
diff --git a/extensions/flags/src/Extension.php b/extensions/flags/src/Extension.php
index bcee8fe97..31bac2cca 100644
--- a/extensions/flags/src/Extension.php
+++ b/extensions/flags/src/Extension.php
@@ -1,4 +1,4 @@
-subscribe('Flarum\Reports\Listeners\AddClientAssets');
- $events->subscribe('Flarum\Reports\Listeners\AddApiAttributes');
- $events->subscribe('Flarum\Reports\Listeners\AddModelRelationship');
+ $events->subscribe('Flarum\Flags\Listeners\AddClientAssets');
+ $events->subscribe('Flarum\Flags\Listeners\AddApiAttributes');
+ $events->subscribe('Flarum\Flags\Listeners\AddModelRelationship');
}
}
diff --git a/extensions/flags/src/Report.php b/extensions/flags/src/Flag.php
similarity index 85%
rename from extensions/flags/src/Report.php
rename to extensions/flags/src/Flag.php
index 32766725a..515ff75fc 100644
--- a/extensions/flags/src/Report.php
+++ b/extensions/flags/src/Flag.php
@@ -1,4 +1,4 @@
-listen(ApiRelationship::class, [$this, 'addReportsRelationship']);
- $events->listen(WillSerializeData::class, [$this, 'loadReportsRelationship']);
- $events->listen(BuildApiAction::class, [$this, 'includeReportsRelationship']);
+ $events->listen(ApiRelationship::class, [$this, 'addFlagsRelationship']);
+ $events->listen(WillSerializeData::class, [$this, 'loadFlagsRelationship']);
+ $events->listen(BuildApiAction::class, [$this, 'includeFlagsRelationship']);
$events->listen(ApiAttributes::class, [$this, 'addAttributes']);
$events->listen(RegisterApiRoutes::class, [$this, 'addRoutes']);
}
- public function loadReportsRelationship(WillSerializeData $event)
+ public function loadFlagsRelationship(WillSerializeData $event)
{
- // For any API action that allows the 'reports' relationship to be
+ // For any API action that allows the 'flags' relationship to be
// included, we need to preload this relationship onto the data (Post
- // models) so that we can selectively expose only the reports that the
+ // models) so that we can selectively expose only the flags that the
// user has permission to view.
if ($event->action instanceof Discussions\ShowAction) {
$discussion = $event->data;
@@ -53,9 +53,9 @@ class AddApiAttributes
$posts = [$event->data];
}
- if ($event->action instanceof ReportsCreateAction) {
- $report = $event->data;
- $posts = [$report->post];
+ if ($event->action instanceof FlagsCreateAction) {
+ $flag = $event->data;
+ $posts = [$flag->post];
}
if (isset($posts)) {
@@ -63,67 +63,67 @@ class AddApiAttributes
$postsWithPermission = [];
foreach ($posts as $post) {
- $post->setRelation('reports', null);
+ $post->setRelation('flags', null);
- if ($post->discussion->can($actor, 'viewReports')) {
+ if ($post->discussion->can($actor, 'viewFlags')) {
$postsWithPermission[] = $post;
}
}
if (count($postsWithPermission)) {
(new Collection($postsWithPermission))
- ->load('reports', 'reports.user');
+ ->load('flags', 'flags.user');
}
}
}
- public function addReportsRelationship(ApiRelationship $event)
+ public function addFlagsRelationship(ApiRelationship $event)
{
if ($event->serializer instanceof PostSerializer &&
- $event->relationship === 'reports') {
- return $event->serializer->hasMany('Flarum\Reports\Api\ReportSerializer', 'reports');
+ $event->relationship === 'flags') {
+ return $event->serializer->hasMany('Flarum\Flags\Api\FlagSerializer', 'flags');
}
}
- public function includeReportsRelationship(BuildApiAction $event)
+ public function includeFlagsRelationship(BuildApiAction $event)
{
if ($event->action instanceof Discussions\ShowAction) {
- $event->addInclude('posts.reports');
- $event->addInclude('posts.reports.user');
+ $event->addInclude('posts.flags');
+ $event->addInclude('posts.flags.user');
}
if ($event->action instanceof Posts\IndexAction ||
$event->action instanceof Posts\ShowAction) {
- $event->addInclude('reports');
- $event->addInclude('reports.user');
+ $event->addInclude('flags');
+ $event->addInclude('flags.user');
}
}
public function addAttributes(ApiAttributes $event)
{
if ($event->serializer instanceof ForumSerializer) {
- $event->attributes['canViewReports'] = $event->actor->hasPermissionLike('discussion.viewReports');
+ $event->attributes['canViewFlags'] = $event->actor->hasPermissionLike('discussion.viewFlags');
- if ($event->attributes['canViewReports']) {
- $query = Report::whereVisibleTo($event->actor);
+ if ($event->attributes['canViewFlags']) {
+ $query = Flag::whereVisibleTo($event->actor);
- if ($time = $event->actor->reports_read_time) {
- $query->where('reports.time', '>', $time);
+ if ($time = $event->actor->flags_read_time) {
+ $query->where('flags.time', '>', $time);
}
- $event->attributes['unreadReportsCount'] = $query->distinct('reports.post_id')->count();
+ $event->attributes['unreadFlagsCount'] = $query->distinct('flags.post_id')->count();
}
}
if ($event->serializer instanceof PostSerializer) {
- $event->attributes['canReport'] = $event->model->can($event->actor, 'report');
+ $event->attributes['canFlag'] = $event->model->can($event->actor, 'flag');
}
}
public function addRoutes(RegisterApiRoutes $event)
{
- $event->get('/reports', 'reports.index', 'Flarum\Reports\Api\IndexAction');
- $event->post('/reports', 'reports.create', 'Flarum\Reports\Api\CreateAction');
- $event->delete('/posts/{id}/reports', 'reports.delete', 'Flarum\Reports\Api\DeleteAction');
+ $event->get('/flags', 'flags.index', 'Flarum\Flags\Api\IndexAction');
+ $event->post('/flags', 'flags.create', 'Flarum\Flags\Api\CreateAction');
+ $event->delete('/posts/{id}/flags', 'flags.delete', 'Flarum\Flags\Api\DeleteAction');
}
}
diff --git a/extensions/flags/src/Listeners/AddClientAssets.php b/extensions/flags/src/Listeners/AddClientAssets.php
index 0171b79ad..48f0f8153 100644
--- a/extensions/flags/src/Listeners/AddClientAssets.php
+++ b/extensions/flags/src/Listeners/AddClientAssets.php
@@ -8,7 +8,7 @@
* file that was distributed with this source code.
*/
-namespace Flarum\Reports\Listeners;
+namespace Flarum\Flags\Listeners;
use Flarum\Events\RegisterLocales;
use Flarum\Events\BuildClientView;
@@ -34,16 +34,16 @@ class AddClientAssets
__DIR__.'/../../less/forum/extension.less'
]);
- $event->forumBootstrapper('reports/main');
+ $event->forumBootstrapper('flags/main');
$event->forumTranslations([
- 'reports.reason_off_topic',
- 'reports.reason_spam',
- 'reports.reason_inappropriate',
- 'reports.reason_other',
- 'reports.reported_by',
- 'reports.reported_by_with_reason',
- 'reports.no_reports'
+ 'flags.reason_off_topic',
+ 'flags.reason_spam',
+ 'flags.reason_inappropriate',
+ 'flags.reason_other',
+ 'flags.flagged_by',
+ 'flags.flagged_by_with_reason',
+ 'flags.no_flags'
]);
$event->adminAssets([
@@ -51,10 +51,10 @@ class AddClientAssets
__DIR__.'/../../less/admin/extension.less'
]);
- $event->adminBootstrapper('reports/main');
+ $event->adminBootstrapper('flags/main');
$event->adminTranslations([
- // 'report.hello_world'
+ // 'flag.hello_world'
]);
}
}
diff --git a/extensions/flags/src/Listeners/AddModelRelationship.php b/extensions/flags/src/Listeners/AddModelRelationship.php
index 8df04624c..72bc12472 100755
--- a/extensions/flags/src/Listeners/AddModelRelationship.php
+++ b/extensions/flags/src/Listeners/AddModelRelationship.php
@@ -1,4 +1,4 @@
-listen(ModelRelationship::class, [$this, 'addReportsRelationship']);
+ $events->listen(ModelRelationship::class, [$this, 'addFlagsRelationship']);
$events->listen(ModelDates::class, [$this, 'modelDates']);
+ $events->listen(PostWasDeleted::class, [$this, 'deleteFlags']);
}
- public function addReportsRelationship(ModelRelationship $event)
+ public function addFlagsRelationship(ModelRelationship $event)
{
- if ($event->model instanceof Post && $event->relationship === 'reports') {
- return $event->model->hasMany('Flarum\Reports\Report', 'post_id');
+ if ($event->model instanceof Post && $event->relationship === 'flags') {
+ return $event->model->hasMany('Flarum\Flags\Flag', 'post_id');
}
}
public function modelDates(ModelDates $event)
{
if ($event->model instanceof User) {
- $event->dates[] = 'reports_read_time';
+ $event->dates[] = 'flags_read_time';
}
}
+
+ public function deleteFlags(PostWasDeleted $event)
+ {
+ $event->post->flags()->delete();
+ }
}