Skip to content

Commit 195b8a9

Browse files
committed
Add easy hide/delete buttons to the saved search sidebar
1 parent 64523dc commit 195b8a9

5 files changed

Lines changed: 105 additions & 5 deletions

File tree

app/assets/stylesheets/components/sidebar.css

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,52 @@
210210
}
211211
}
212212

213+
.sidebar .quick-filters li {
214+
display: flex;
215+
align-items: center;
216+
}
217+
218+
.sidebar .quick-filters li a {
219+
flex: 1;
220+
min-width: 0;
221+
}
222+
223+
.sidebar .quick-filter-action-form {
224+
flex-shrink: 0;
225+
line-height: 1;
226+
opacity: 0;
227+
transition: opacity var(--transition-fast);
228+
}
229+
230+
.sidebar .quick-filters li:hover .quick-filter-action-form,
231+
.sidebar .quick-filter-action-form:focus-within {
232+
opacity: 1;
233+
}
234+
235+
.sidebar .quick-filter-action-form button {
236+
appearance: none;
237+
background: var(--color-bg-button);
238+
color: var(--color-text-button);
239+
border: var(--border-width) solid var(--color-border);
240+
border-radius: var(--border-radius-md);
241+
cursor: pointer;
242+
padding: var(--spacing-1) var(--spacing-2);
243+
font-size: var(--font-size-xs);
244+
line-height: 1;
245+
transition: background var(--transition-fast), border-color var(--transition-fast);
246+
}
247+
248+
.sidebar .quick-filter-action-form button:hover {
249+
background: var(--color-bg-button-hover);
250+
border-color: var(--color-primary-300);
251+
}
252+
253+
@media (hover: none) {
254+
.sidebar .quick-filter-action-form {
255+
opacity: 1;
256+
}
257+
}
258+
213259
.sidebar .tags-list {
214260
padding-left: var(--spacing-3);
215261
}

app/controllers/settings/saved_search_preferences_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
module Settings
44
class SavedSearchPreferencesController < Settings::BaseController
55
def create
6-
saved_search = SavedSearch.find(params[:saved_search_id])
6+
saved_search = SavedSearch.visible_to(current_user).find(params[:saved_search_id])
77
hidden = ActiveModel::Type::Boolean.new.cast(params[:hidden])
88

99
pref = SavedSearchPreference.find_or_initialize_by(

app/controllers/settings/saved_searches_controller.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ def update
4747

4848
def destroy
4949
@saved_search.destroy
50-
redirect_to settings_saved_searches_path, notice: "Saved search deleted"
50+
redirect_back fallback_location: settings_saved_searches_path, notice: "Saved search deleted"
5151
end
5252

5353
private

app/views/topics/_sidebar.html.slim

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,10 @@
3636
span.filter-subsection-label Global
3737
ul.quick-filters
3838
- global_searches.each do |ss|
39-
li = link_to ss.name, search_topics_path(saved_search_id: ss.id), class: ("quick-filter-link is-active" if active_ss_id == ss.id)
39+
li
40+
= link_to ss.name, search_topics_path(saved_search_id: ss.id), class: ("quick-filter-link is-active" if active_ss_id == ss.id)
41+
= button_to settings_saved_search_preferences_path(saved_search_id: ss.id, hidden: true), method: :post, form_class: "quick-filter-action-form", data: { turbo_confirm: "Hide this search?" } do
42+
i.fa-solid.fa-eye-slash aria-hidden="true"
4043

4144
- if user_signed_in?
4245
- user_searches = @saved_searches.select { |ss| ss.scope_user? && ss.user_id.present? }
@@ -47,7 +50,14 @@
4750
span.filter-subsection-label My searches
4851
ul.quick-filters
4952
- all_user.each do |ss|
50-
li = link_to ss.name, search_topics_path(saved_search_id: ss.id), class: ("quick-filter-link is-active" if active_ss_id == ss.id)
53+
li
54+
= link_to ss.name, search_topics_path(saved_search_id: ss.id), class: ("quick-filter-link is-active" if active_ss_id == ss.id)
55+
- if ss.user_id == current_user.id
56+
= button_to settings_saved_search_path(ss), method: :delete, form_class: "quick-filter-action-form", data: { turbo_confirm: "Delete this search?" } do
57+
i.fa-solid.fa-trash-can aria-hidden="true"
58+
- else
59+
= button_to settings_saved_search_preferences_path(saved_search_id: ss.id, hidden: true), method: :post, form_class: "quick-filter-action-form", data: { turbo_confirm: "Hide this search?" } do
60+
i.fa-solid.fa-eye-slash aria-hidden="true"
5161

5262
- team_templates = @saved_searches.select { |ss| ss.scope_team? && ss.team_id.nil? }
5363
- team_specific = @saved_searches.select { |ss| ss.scope_team? && ss.team_id.present? }
@@ -59,7 +69,10 @@
5969
span.filter-subsection-label = "#{team.name} searches"
6070
ul.quick-filters
6171
- all_team.each do |ss|
62-
li = link_to ss.name, search_topics_path(saved_search_id: ss.id, team_id: team.id), class: ("quick-filter-link is-active" if active_ss_id == ss.id && (!ss.scope_team? || active_team_id == team.id))
72+
li
73+
= link_to ss.name, search_topics_path(saved_search_id: ss.id, team_id: team.id), class: ("quick-filter-link is-active" if active_ss_id == ss.id && (!ss.scope_team? || active_team_id == team.id))
74+
= button_to settings_saved_search_preferences_path(saved_search_id: ss.id, hidden: true), method: :post, form_class: "quick-filter-action-form", data: { turbo_confirm: "Hide this search?" } do
75+
i.fa-solid.fa-eye-slash aria-hidden="true"
6376

6477
- if user_signed_in? && @available_note_tags.present?
6578
.sidebar-section

spec/requests/settings/saved_search_preferences_spec.rb

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,47 @@ def sign_in(user)
3838
expect(pref.reload.hidden).to be false
3939
end
4040

41+
it "hides a team-specific saved search for a team member" do
42+
user = create(:user)
43+
team = create(:team)
44+
create(:team_member, team: team, user: user)
45+
saved_search = create(:saved_search, scope: "team", team: team)
46+
sign_in(user)
47+
48+
expect {
49+
post settings_saved_search_preferences_path, params: { saved_search_id: saved_search.id, hidden: true }
50+
}.to change(SavedSearchPreference, :count).by(1)
51+
52+
pref = SavedSearchPreference.last
53+
expect(pref.hidden).to be true
54+
end
55+
56+
it "hides a team template saved search" do
57+
user = create(:user)
58+
saved_search = create(:saved_search, scope: "team", team: nil)
59+
sign_in(user)
60+
61+
expect {
62+
post settings_saved_search_preferences_path, params: { saved_search_id: saved_search.id, hidden: true }
63+
}.to change(SavedSearchPreference, :count).by(1)
64+
65+
pref = SavedSearchPreference.last
66+
expect(pref.hidden).to be true
67+
end
68+
69+
it "rejects hiding a search not visible to the user" do
70+
user = create(:user)
71+
other_user = create(:user)
72+
saved_search = create(:saved_search, scope: "user", user: other_user)
73+
sign_in(user)
74+
75+
expect {
76+
post settings_saved_search_preferences_path, params: { saved_search_id: saved_search.id, hidden: true }
77+
}.not_to change(SavedSearchPreference, :count)
78+
79+
expect(response).to have_http_status(:not_found)
80+
end
81+
4182
it "redirects guests to new_session_path" do
4283
saved_search = create(:saved_search)
4384

0 commit comments

Comments
 (0)