From 082b595626342aa5dc4ed86279b3055bbca0bdd8 Mon Sep 17 00:00:00 2001 From: IanM <16573496+imorland@users.noreply.github.com> Date: Thu, 26 Sep 2024 11:32:40 +0100 Subject: [PATCH] =?UTF-8?q?allow=20extending=20solution=20search=20query,?= =?UTF-8?q?=20limit.=20setting=20to=20display=20disc=E2=80=A6=20(#99)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * allow extending solution search query, limit. setting to display discussion tag in search results * Apply fixes from StyleCI --------- Co-authored-by: StyleCI Bot --- extend.php | 11 ++--- .../components/BestAnswerSettingsPage.tsx | 6 +++ .../forum/components/SolutionSearchItem.tsx | 3 +- .../forum/components/SolutionSearchSource.tsx | 8 +++- src/ForumAttributes.php | 48 +++++++++++++++++++ 5 files changed, 68 insertions(+), 8 deletions(-) create mode 100644 src/ForumAttributes.php diff --git a/extend.php b/extend.php index fa0df14..5f6ac4e 100644 --- a/extend.php +++ b/extend.php @@ -89,13 +89,12 @@ ->default('fof-best-answer.store_log_output', false) ->default('fof-best-answer.enabled-tags', '[]') ->default('fof-best-answer.search.solution_search', true) + ->default('fof-best-answer.search.display_tags', true) ->default('fof-best-answer.discussion_sidebar_jump_button', false) - ->serializeToForum('canSelectBestAnswerOwnPost', 'fof-best-answer.allow_select_own_post', 'boolVal') - ->serializeToForum('useAlternativeBestAnswerUi', 'fof-best-answer.use_alternative_ui', 'boolVal') - ->serializeToForum('showBestAnswerFilterUi', 'fof-best-answer.show_filter_dropdown', 'boolVal') - ->serializeToForum('fof-best-answer.show_max_lines', 'fof-best-answer.show_max_lines', 'intVal') - ->serializeToForum('solutionSearchEnabled', 'fof-best-answer.search.solution_search', 'boolVal') - ->serializeToForum('bestAnswerDiscussionSidebarJumpButton', 'fof-best-answer.discussion_sidebar_jump_button', 'boolVal'), + ->serializeToForum('fof-best-answer.show_max_lines', 'fof-best-answer.show_max_lines', 'intVal'), + + (new Extend\ApiSerializer(Serializer\ForumSerializer::class)) + ->attributes(ForumAttributes::class), (new Extend\ApiController(ShowDiscussionController::class)) ->addInclude(['bestAnswerPost', 'bestAnswerUser']) diff --git a/js/src/admin/components/BestAnswerSettingsPage.tsx b/js/src/admin/components/BestAnswerSettingsPage.tsx index 29f7a07..bab1dc5 100644 --- a/js/src/admin/components/BestAnswerSettingsPage.tsx +++ b/js/src/admin/components/BestAnswerSettingsPage.tsx @@ -84,6 +84,12 @@ export default class BestAnswerSettingsPage extends ExtensionPage { label: app.translator.trans('fof-best-answer.admin.settings.solution_search'), help: app.translator.trans('fof-best-answer.admin.settings.solution_search_help'), })} + {this.buildSettingComponent({ + type: 'boolean', + setting: 'fof-best-answer.search.display_tags', + label: app.translator.trans('fof-best-answer.admin.settings.display_tags'), + help: app.translator.trans('fof-best-answer.admin.settings.display_tags_help'), + })}

{app.translator.trans('fof-best-answer.admin.settings.label.reminders')}

diff --git a/js/src/forum/components/SolutionSearchItem.tsx b/js/src/forum/components/SolutionSearchItem.tsx index 0852078..a474442 100644 --- a/js/src/forum/components/SolutionSearchItem.tsx +++ b/js/src/forum/components/SolutionSearchItem.tsx @@ -59,7 +59,8 @@ export default class SolutionSearchItem extends Component { const items = new ItemList(); - items.add('tags',

{tagsLabel(this.tags)}
, 100); + app.forum.attribute('showTagsInSearchResults') && + items.add('tags',
{tagsLabel(this.tags)}
, 100); items.add('discussion-title',
{highlight(this.discussionTitle(), this.query)}
, 90); diff --git a/js/src/forum/components/SolutionSearchSource.tsx b/js/src/forum/components/SolutionSearchSource.tsx index 4fec5ad..79b3636 100644 --- a/js/src/forum/components/SolutionSearchSource.tsx +++ b/js/src/forum/components/SolutionSearchSource.tsx @@ -14,8 +14,10 @@ export default class SolutionSearchSource implements SearchSource { this.results.set(query, []); + const queryString = query + ' ' + this.queryMutators().join(' '); + const params = { - filter: { q: query + ' is:solved' }, + filter: { q: queryString }, page: { limit: this.limit() }, include: this.includes().join(','), }; @@ -60,4 +62,8 @@ export default class SolutionSearchSource implements SearchSource { limit(): number { return 3; } + + queryMutators(): string[] { + return ['is:solved']; + } } diff --git a/src/ForumAttributes.php b/src/ForumAttributes.php new file mode 100644 index 0000000..810cd18 --- /dev/null +++ b/src/ForumAttributes.php @@ -0,0 +1,48 @@ +settings = $settings; + } + + public function __invoke(ForumSerializer $serializer, $model, array $attributes): array + { + if ($value = $this->getBooleanSetting('fof-best-answer.search.solution_search')) { + $attributes['showTagsInSearchResults'] = $this->getBooleanSetting('fof-best-answer.search.display_tags'); + } + + $attributes['solutionSearchEnabled'] = $value; + $attributes['canSelectBestAnswerOwnPost'] = $this->getBooleanSetting('fof-best-answer.allow_select_own_post'); + $attributes['useAlternativeBestAnswerUi'] = $this->getBooleanSetting('fof-best-answer.use_alternative_ui'); + $attributes['showBestAnswerFilterUi'] = $this->getBooleanSetting('fof-best-answer.show_filter_dropdown'); + $attributes['bestAnswerDiscussionSidebarJumpButton'] = $this->getBooleanSetting('fof-best-answer.discussion_sidebar_jump_button'); + + return $attributes; + } + + protected function getBooleanSetting(string $key): bool + { + return (bool) $this->settings->get($key); + } +}