mirror of
https://github.com/flarum/core.git
synced 2025-08-19 06:41:44 +02:00
feat: post search adapted with global search (#4019)
This commit is contained in:
7
extensions/likes/js/src/common/extend.ts
Normal file
7
extensions/likes/js/src/common/extend.ts
Normal file
@@ -0,0 +1,7 @@
|
||||
import Extend from 'flarum/common/extenders';
|
||||
import LikedByGambit from './query/posts/LikedByGambit';
|
||||
|
||||
export default [
|
||||
new Extend.Search() //
|
||||
.gambit('posts', LikedByGambit),
|
||||
];
|
16
extensions/likes/js/src/common/query/posts/LikedByGambit.ts
Normal file
16
extensions/likes/js/src/common/query/posts/LikedByGambit.ts
Normal file
@@ -0,0 +1,16 @@
|
||||
import { KeyValueGambit } from 'flarum/common/query/IGambit';
|
||||
import app from 'flarum/common/app';
|
||||
|
||||
export default class LikedByGambit extends KeyValueGambit {
|
||||
key(): string {
|
||||
return app.translator.trans('flarum-likes.lib.gambits.posts.likedBy.key', {}, true);
|
||||
}
|
||||
|
||||
hint(): string {
|
||||
return app.translator.trans('flarum-likes.lib.gambits.posts.likedBy.hint', {}, true);
|
||||
}
|
||||
|
||||
filterKey(): string {
|
||||
return 'likedBy';
|
||||
}
|
||||
}
|
16
extensions/likes/js/src/forum/components/LikesUserPage.ts
Normal file
16
extensions/likes/js/src/forum/components/LikesUserPage.ts
Normal file
@@ -0,0 +1,16 @@
|
||||
import PostsUserPage from 'flarum/forum/components/PostsUserPage';
|
||||
import type User from 'flarum/common/models/User';
|
||||
|
||||
/**
|
||||
* The `LikesUserPage` component shows posts which user the user liked.
|
||||
*/
|
||||
export default class LikesUserPage extends PostsUserPage {
|
||||
params(user: User) {
|
||||
return {
|
||||
filter: {
|
||||
type: 'comment',
|
||||
likedBy: user.id(),
|
||||
},
|
||||
};
|
||||
}
|
||||
}
|
@@ -1,24 +0,0 @@
|
||||
import app from 'flarum/forum/app';
|
||||
import PostsUserPage from 'flarum/forum/components/PostsUserPage';
|
||||
|
||||
/**
|
||||
* The `LikesUserPage` component shows posts which user the user liked.
|
||||
*/
|
||||
export default class LikesUserPage extends PostsUserPage {
|
||||
/**
|
||||
* Load a new page of the user's activity feed.
|
||||
*
|
||||
* @param offset The position to start getting results from.
|
||||
* @protected
|
||||
*/
|
||||
loadResults(offset: number) {
|
||||
return app.store.find('posts', {
|
||||
filter: {
|
||||
type: 'comment',
|
||||
likedBy: this.user.id(),
|
||||
},
|
||||
page: { offset, limit: this.loadLimit },
|
||||
sort: '-createdAt',
|
||||
});
|
||||
}
|
||||
}
|
@@ -4,7 +4,11 @@ import User from 'flarum/common/models/User';
|
||||
import LikesUserPage from './components/LikesUserPage';
|
||||
import PostLikedNotification from './components/PostLikedNotification';
|
||||
|
||||
import commonExtend from '../common/extend';
|
||||
|
||||
export default [
|
||||
...commonExtend,
|
||||
|
||||
new Extend.Routes() //
|
||||
.add('user.likes', '/u/:username/likes', LikesUserPage),
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
import { extend } from 'flarum/common/extend';
|
||||
import { extend, override } from 'flarum/common/extend';
|
||||
import app from 'flarum/forum/app';
|
||||
|
||||
import addLikeAction from './addLikeAction';
|
||||
@@ -19,4 +19,20 @@ app.initializers.add('flarum-likes', () => {
|
||||
label: app.translator.trans('flarum-likes.forum.settings.notify_post_liked_label'),
|
||||
});
|
||||
});
|
||||
|
||||
// Auto scope the search to the current user liked posts.
|
||||
override('flarum/forum/components/SearchModal', 'defaultActiveSource', function (original) {
|
||||
const orig = original();
|
||||
|
||||
if (!orig && app.current.data.routeName && app.current.data.routeName.includes('user.likes') && app.current.data.user) {
|
||||
return 'posts';
|
||||
}
|
||||
|
||||
return orig;
|
||||
});
|
||||
extend('flarum/forum/components/SearchModal', 'defaultFilters', function (filters) {
|
||||
if (app.current.data.routeName && app.current.data.routeName.includes('user.likes') && app.current.data.user) {
|
||||
filters.posts.likedBy = app.current.data.user.username();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
@@ -44,3 +44,13 @@ flarum-likes:
|
||||
# These translations are used in the User profile page.
|
||||
user:
|
||||
likes_link: Likes
|
||||
|
||||
# Translations in this namespace are used by the forum and admin interfaces.
|
||||
lib:
|
||||
|
||||
# These translations are used by gambits. Gambit keys must be in snake_case, no spaces.
|
||||
gambits:
|
||||
posts:
|
||||
likedBy:
|
||||
key: likedBy
|
||||
hint: The ID or username of the user
|
||||
|
@@ -13,6 +13,7 @@ use Flarum\Search\Database\DatabaseSearchState;
|
||||
use Flarum\Search\Filter\FilterInterface;
|
||||
use Flarum\Search\SearchState;
|
||||
use Flarum\Search\ValidateFilterTrait;
|
||||
use Flarum\User\UserRepository;
|
||||
|
||||
/**
|
||||
* @implements FilterInterface<DatabaseSearchState>
|
||||
@@ -21,6 +22,11 @@ class LikedByFilter implements FilterInterface
|
||||
{
|
||||
use ValidateFilterTrait;
|
||||
|
||||
public function __construct(
|
||||
protected UserRepository $users
|
||||
) {
|
||||
}
|
||||
|
||||
public function getFilterKey(): string
|
||||
{
|
||||
return 'likedBy';
|
||||
@@ -28,7 +34,13 @@ class LikedByFilter implements FilterInterface
|
||||
|
||||
public function filter(SearchState $state, string|array $value, bool $negate): void
|
||||
{
|
||||
$likedId = $this->asInt($value);
|
||||
$likedUsername = $this->asString($value);
|
||||
|
||||
$likedId = $this->users->getIdForUsername($likedUsername);
|
||||
|
||||
if (! $likedId) {
|
||||
$likedId = intval($likedUsername);
|
||||
}
|
||||
|
||||
$state
|
||||
->getQuery()
|
||||
|
@@ -13,6 +13,7 @@ use Flarum\Search\Database\DatabaseSearchState;
|
||||
use Flarum\Search\Filter\FilterInterface;
|
||||
use Flarum\Search\SearchState;
|
||||
use Flarum\Search\ValidateFilterTrait;
|
||||
use Flarum\User\UserRepository;
|
||||
|
||||
/**
|
||||
* @implements FilterInterface<DatabaseSearchState>
|
||||
@@ -21,6 +22,11 @@ class LikedFilter implements FilterInterface
|
||||
{
|
||||
use ValidateFilterTrait;
|
||||
|
||||
public function __construct(
|
||||
protected UserRepository $users
|
||||
) {
|
||||
}
|
||||
|
||||
public function getFilterKey(): string
|
||||
{
|
||||
return 'liked';
|
||||
|
Reference in New Issue
Block a user