From ad9baffa627172357f2eb84166ba6555166803cf Mon Sep 17 00:00:00 2001 From: KodeStar Date: Wed, 8 Jul 2026 18:26:19 +0100 Subject: [PATCH] Only offer pinned tags as the default tag The default_tag dropdown was populated from every tag (type=1), but the dashboard taglist only renders pinned tags. Selecting an unpinned tag as the default therefore triggered a click on a taglist entry that does not exist, silently doing nothing. Filter the option queries in both Setting accessors to pinned tags so only selectable tags are offered, and assert an unpinned tag is excluded. Also drop the unused $data['default_tag'] assignment in ItemController: the taglist partial reads the setting directly via Setting::fetch(), so the view variable was never consumed. --- app/Http/Controllers/ItemController.php | 1 - app/Setting.php | 4 ++-- .../Unit/database/seeders/SettingsSeederTest.php | 16 +++++++++++++++- 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/ItemController.php b/app/Http/Controllers/ItemController.php index 87a383089..cd5492b1e 100644 --- a/app/Http/Controllers/ItemController.php +++ b/app/Http/Controllers/ItemController.php @@ -40,7 +40,6 @@ class ItemController extends Controller $treat_tags_as = \App\Setting::fetch('treat_tags_as'); $data["treat_tags_as"] = $treat_tags_as; - $data['default_tag'] = \App\Setting::fetch('default_tag'); if (config('app.auth_roles_enable')) { $roles = explode(config('app.auth_roles_delimiter'), $request->header(config('app.auth_roles_header'))); diff --git a/app/Setting.php b/app/Setting.php index 72768d363..74532ef70 100644 --- a/app/Setting.php +++ b/app/Setting.php @@ -125,7 +125,7 @@ class Setting extends Model $options = Search::providers()->pluck('name', 'id')->toArray(); } elseif ($this->key === 'default_tag') { $options = []; - $tags = Item::where('type', 1)->where('id', '>', 0)->orderBy('title', 'asc')->get(); + $tags = Item::where('type', 1)->where('id', '>', 0)->pinned()->orderBy('title', 'asc')->get(); foreach ($tags as $tag) { $options[$tag->tag_url] = $tag->title; } @@ -198,7 +198,7 @@ class Setting extends Model $options = Search::providers()->pluck('name', 'id'); } elseif ($this->key === 'default_tag') { $options = ['' => 'app.options.none']; - $tags = Item::where('type', 1)->where('id', '>', 0)->orderBy('title', 'asc')->get(); + $tags = Item::where('type', 1)->where('id', '>', 0)->pinned()->orderBy('title', 'asc')->get(); foreach ($tags as $tag) { $options[$tag->tag_url] = $tag->title; } diff --git a/tests/Unit/database/seeders/SettingsSeederTest.php b/tests/Unit/database/seeders/SettingsSeederTest.php index 01bf6701f..afed4bc65 100644 --- a/tests/Unit/database/seeders/SettingsSeederTest.php +++ b/tests/Unit/database/seeders/SettingsSeederTest.php @@ -43,12 +43,23 @@ class SettingsSeederTest extends TestCase 'title' => 'Home', 'url' => 'home-dashboard', 'type' => 1, + 'pinned' => 1, 'user_id' => 0, ]); Item::factory()->create([ 'title' => 'Media', 'url' => 'media', 'type' => 1, + 'pinned' => 1, + 'user_id' => 0, + ]); + // An unpinned tag is not rendered in the dashboard taglist, so it must + // not be offered as a default (selecting it would silently do nothing). + Item::factory()->create([ + 'title' => 'Archive', + 'url' => 'archive', + 'type' => 1, + 'pinned' => 0, 'user_id' => 0, ]); @@ -59,10 +70,13 @@ class SettingsSeederTest extends TestCase $this->assertStringContainsString('', $editValue); $this->assertStringContainsString('value="media"', $editValue); $this->assertStringContainsString('>Media', $editValue); + + // The unpinned tag is excluded. + $this->assertStringNotContainsString('value="archive"', $editValue); } }