From dbc8bf2ae186b36c58638c46434f991e26648f08 Mon Sep 17 00:00:00 2001 From: Hugo Sales Date: Sat, 11 Dec 2021 10:48:08 +0000 Subject: [PATCH] [COMPONENT][Search][LeftPanel] Add way of adding a search result as a left panel feed --- components/LeftPanel/LeftPanel.php | 28 ++++++++++++ components/Search/Controller/Search.php | 4 +- components/Search/Search.php | 59 +++++++++++++++++++++---- 3 files changed, 80 insertions(+), 11 deletions(-) diff --git a/components/LeftPanel/LeftPanel.php b/components/LeftPanel/LeftPanel.php index 7e09fb2d13..7036525e81 100644 --- a/components/LeftPanel/LeftPanel.php +++ b/components/LeftPanel/LeftPanel.php @@ -21,9 +21,16 @@ declare(strict_types = 1); namespace Component\LeftPanel; +use App\Core\Cache; +use App\Core\DB\DB; use App\Core\Event; +use function App\Core\I18n\_m; use App\Core\Modules\Component; use App\Core\Router\RouteLoader; +use App\Core\Router\Router; +use App\Entity\Actor; +use App\Entity\Feed; +use App\Util\Exception\ClientException; use Component\LeftPanel\Controller as C; class LeftPanel extends Component @@ -34,6 +41,27 @@ class LeftPanel extends Component return Event::next; } + public function onAppendFeed(Actor $actor, string $title, string $route, array $route_params) + { + $cache_key = Feed::cacheKey($actor); + $feeds = Feed::getFeeds($actor); + $ordering = end($feeds)->getOrdering(); + $url = Router::url($route, $route_params); + if (DB::count('feed', ['actor_id' => $actor->getId(), 'url' => $url]) === 0) { + DB::persist(Feed::create([ + 'actor_id' => $actor->getId(), + 'url' => $url, + 'route' => $route, + 'title' => $title, + 'ordering' => $ordering + 1, + ])); + DB::flush(); + Cache::delete($cache_key); + return Event::stop; + } + throw new ClientException(_m('Cannot add feed with url "{url}" because it already exists', ['{url}' => $url])); + } + /** * Output our dedicated stylesheet * diff --git a/components/Search/Controller/Search.php b/components/Search/Controller/Search.php index ba07971d31..515921223c 100644 --- a/components/Search/Controller/Search.php +++ b/components/Search/Controller/Search.php @@ -92,7 +92,7 @@ class Search extends FeedController $query[] = "{$key}:{$langs}"; } } else { - throw new BugFoundException('Search form seems to have new fields the code did not expect'); + throw new BugFoundException('Search builder form seems to have new fields the code did not expect'); } } } @@ -103,7 +103,7 @@ class Search extends FeedController return [ '_template' => 'search/show.html.twig', - 'search_form' => Comp\Search::searchForm($request, $q), + 'search_form' => Comp\Search::searchForm($request, query: $q, add_subscribe: true), 'search_builder_form' => $search_builder_form->createView(), 'notes' => $notes, 'actors' => $actors, diff --git a/components/Search/Search.php b/components/Search/Search.php index bbaf34cb58..c2b592e8c7 100644 --- a/components/Search/Search.php +++ b/components/Search/Search.php @@ -27,10 +27,12 @@ use App\Core\Event; use App\Core\Form; use function App\Core\I18n\_m; use App\Core\Modules\Component; +use App\Util\Common; use App\Util\Exception\RedirectException; use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\FormView; +use Symfony\Component\Form\SubmitButton; use Symfony\Component\HttpFoundation\Request; class Search extends Component @@ -40,28 +42,67 @@ class Search extends Component $r->connect('search', '/search', Controller\Search::class); } - public static function searchForm(Request $request, ?string $query = null): FormView + public static function searchForm(Request $request, ?string $query = null, bool $add_subscribe = false): FormView { - $form = Form::create([ + $actor = Common::actor(); + if (\is_null($actor)) { + $add_subscribe = false; + } + + $form_definition = [ ['search_query', TextType::class, [ 'attr' => ['placeholder' => _m('Input desired query...'), 'value' => $query], ]], - [$form_name = 'submit_search', SubmitType::class, + ]; + + if ($add_subscribe) { + $form_definition[] = [ + 'title', TextType::class, ['label' => _m('Title'), 'attr' => ['title' => _m('Title for this new feed in your left panel')]], + ]; + $form_definition[] = [ + 'subscribe_to_search', + SubmitType::class, [ - 'label' => _m('Search'), + 'label' => _m('Subscribe to this search'), 'attr' => [ - //'class' => 'button-container search-button-container', - 'title' => _m('Query notes for specific tags.'), + 'title' => _m('Add this search as a feed in your feeds section of the left panel'), ], ], + ]; + } + + $form_definition[] = [ + $form_name = 'submit_search', + SubmitType::class, + [ + 'label' => _m('Search'), + 'attr' => [ + //'class' => 'button-container search-button-container', + 'title' => _m('Query notes for specific tags.'), + ], ], - ]); + ]; + + $form = Form::create($form_definition); if ('POST' === $request->getMethod() && $request->request->has($form_name)) { $form->handleRequest($request); if ($form->isSubmitted() && $form->isValid()) { - $data = $form->getData(); - throw new RedirectException('search', ['q' => $data['search_query']]); + $data = $form->getData(); + $redirect = false; + if ($add_subscribe) { + /** @var SubmitButton $subscribe */ + $subscribe = $form->get('subscribe_to_search'); + if ($subscribe->isClicked()) { + Event::handle('AppendFeed', [$actor, $data['title'], 'search', ['q' => $data['search_query']]]); + $redirect = true; + } + } + /** @var SubmitButton $submit */ + $submit = $form->get($form_name); + if ($submit->isClicked() || $redirect) { + throw new RedirectException('search', ['q' => $data['search_query']]); + } } } return $form->createView();