Skip to content

Commit

Permalink
Show fish location to moderators, fix incorrect placed by value
Browse files Browse the repository at this point in the history
  • Loading branch information
clarkwinkelmann committed Nov 16, 2021
1 parent c1d62d7 commit 4a49e68
Show file tree
Hide file tree
Showing 9 changed files with 76 additions and 6 deletions.
2 changes: 1 addition & 1 deletion js/dist/admin.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion js/dist/admin.js.map

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion js/dist/forum.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion js/dist/forum.js.map

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions js/src/forum/models/Fish.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ export default class Fish extends Model {
namedBy: () => User | false = Model.hasOne('lastUserNaming');
placedBy: () => User | false = Model.hasOne('lastUserPlacement');
round = Model.hasOne('round');
placementModel = Model.hasOne('placement'); // Only used by the admin panel to show the link to the resource

apiEndpoint() {
return '/catch-the-fish/' + (this.exists ? 'fishes/' + this.data.id : 'rounds/' + this.data.attributes.round_id + '/fishes');
Expand Down
34 changes: 33 additions & 1 deletion js/src/forum/pages/RoundSettings.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
import {Vnode} from 'mithril';
import app from 'flarum/forum/app';
import Link from 'flarum/common/components/Link';
import Page from 'flarum/common/components/Page';
import Button from 'flarum/common/components/Button';
import Discussion from 'flarum/common/models/Discussion';
import Post from 'flarum/common/models/Post';
import UserModel from 'flarum/common/models/User';
import NewFishModal from '../modals/NewFishModal';
import EditFishModal from '../modals/EditFishModal';
import FishImage from '../components/FishImage';
Expand Down Expand Up @@ -124,13 +128,14 @@ export default class RoundSettings extends Page {
m('th', app.translator.trans(translationPrefix + 'name')),
m('th', app.translator.trans(translationPrefix + 'user-name')),
m('th', app.translator.trans(translationPrefix + 'user-place')),
m('th', app.translator.trans(translationPrefix + 'placement')),
m('th', app.translator.trans(translationPrefix + 'actions')),
])),
m('tbody', this.fishes.length === 0 ? m('tr', [
m('td', 'No fishes'),
]) : this.fishes.map(fish => {
const namedBy = fish.namedBy();
const placedBy = fish.namedBy();
const placedBy = fish.placedBy();

return m('tr', [
m('td', m(FishImage, {
Expand All @@ -143,6 +148,7 @@ export default class RoundSettings extends Page {
m('td', placedBy ? m(User, {
user: placedBy,
}) : m('em', app.translator.trans(translationPrefix + 'no-user-place'))),
m('td', this.placement(fish)),
m('td', [
Button.component({
className: 'Button',
Expand Down Expand Up @@ -172,4 +178,30 @@ export default class RoundSettings extends Page {
]),
]);
}

placement(fish: Fish): any {
const placement = fish.placementModel();

if (placement instanceof Discussion) {
return m(Link, {
href: app.route.discussion(placement),
}, placement.title());
}

if (placement instanceof Post) {
const discussion = placement.discussion();

return m(Link, {
href: app.route.post(placement),
}, (discussion ? discussion.title() : '') + ' #' + placement.number());
}

if (placement instanceof UserModel) {
return m(User, {
user: placement,
});
}

return 'N/A';
}
}
1 change: 1 addition & 0 deletions resources/locale/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ clarkwinkelmann-catch-the-fish:
name: Name
user-name: Last named by
user-place: Last placed by
placement: Current location
actions: Actions
edit: Edit
no-user-name: Not renamed
Expand Down
2 changes: 2 additions & 0 deletions src/Controllers/FishIndexController.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ class FishIndexController extends AbstractListController
public $include = [
'lastUserPlacement',
'lastUserNaming',
'placement',
'placement.discussion', // For when it's a post
];

protected $rounds;
Expand Down
36 changes: 35 additions & 1 deletion src/Serializers/FishSerializer.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,13 @@

use ClarkWinkelmann\CatchTheFish\Fish;
use Flarum\Api\Serializer\AbstractSerializer;
use Flarum\Api\Serializer\BasicDiscussionSerializer;
use Flarum\Api\Serializer\BasicUserSerializer;
use Flarum\Api\Serializer\PostSerializer;
use Flarum\Api\Serializer\UserSerializer;
use Flarum\Foundation\ValidationException;
use Tobscure\JsonApi\Relationship;
use Tobscure\JsonApi\Resource;

class FishSerializer extends AbstractSerializer
{
Expand Down Expand Up @@ -34,7 +38,7 @@ protected function getDefaultAttributes($fish): array
return [
'name' => $fish->name,
'image_url' => $fish->image_url,
'placement' => $this->actorCan('catch', $fish) ? [
'placement' => $this->actorCan('catch', $fish) || $this->actorCan('catchthefish.moderate') ? [
'discussion_id' => $fish->discussion_id_placement,
'post_id' => $fish->post_id_placement,
'user_id' => $fish->user_id_placement,
Expand All @@ -61,4 +65,34 @@ public function lastUserNaming($fish): ?Relationship
{
return $this->buildRelationship($fish, UserSerializer::class, 'lastUserNaming');
}

protected function placementRelationship($data, string $serializer): ?Relationship
{
if (!$data) {
return null;
}

$serializer = $this->resolveSerializerClass($serializer);

$element = new Resource($data, $serializer);

return new Relationship($element);
}

public function placement(Fish $fish): ?Relationship
{
if ($fish->discussion_id_placement) {
return $this->placementRelationship($fish->placementDiscussion()->whereVisibleTo($this->actor)->first(), BasicDiscussionSerializer::class);
}

if ($fish->post_id_placement) {
return $this->placementRelationship($fish->placementPost()->whereVisibleTo($this->actor)->first(), PostSerializer::class);
}

if ($fish->user_id_placement) {
return $this->placementRelationship($fish->placementUser()->whereVisibleTo($this->actor)->first(), BasicUserSerializer::class);
}

return null;
}
}

0 comments on commit 4a49e68

Please sign in to comment.