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