From cea2a9fe53def516183747f8513e714af1f86a99 Mon Sep 17 00:00:00 2001 From: Kyle Zhao <kzhao.sw@gmail.com> Date: Tue, 8 Aug 2017 04:08:07 -0400 Subject: [PATCH 1/2] UX: exclude irrelevant search filters for anonymous users On the advanced search page, filters like "I've read", "I'm watch -ing", etc, are irrelevant to anonymous users and should be hidden --- .../components/search-advanced-options.js.es6 | 7 ++- .../components/search-advanced-options.hbs | 12 +++-- .../acceptance/search-full-test.js.es6 | 1 + .../javascripts/acceptance/search-test.js.es6 | 52 ++++++++++++++++++- 4 files changed, 64 insertions(+), 8 deletions(-) diff --git a/app/assets/javascripts/discourse/components/search-advanced-options.js.es6 b/app/assets/javascripts/discourse/components/search-advanced-options.js.es6 index 109182042c4..f29c6f95a39 100644 --- a/app/assets/javascripts/discourse/components/search-advanced-options.js.es6 +++ b/app/assets/javascripts/discourse/components/search-advanced-options.js.es6 @@ -30,12 +30,14 @@ const IN_OPTIONS_MAPPING = {'images': 'with'}; export default Em.Component.extend({ classNames: ['search-advanced-options'], - inOptions: [ + inOptionsForUsers: [ {name: I18n.t('search.advanced.filters.unseen'), value: "unseen"}, {name: I18n.t('search.advanced.filters.posted'), value: "posted"}, {name: I18n.t('search.advanced.filters.watching'), value: "watching"}, {name: I18n.t('search.advanced.filters.tracking'), value: "tracking"}, {name: I18n.t('search.advanced.filters.bookmarks'), value: "bookmarks"}, + ], + inOptionsForAll: [ {name: I18n.t('search.advanced.filters.first'), value: "first"}, {name: I18n.t('search.advanced.filters.pinned'), value: "pinned"}, {name: I18n.t('search.advanced.filters.unpinned'), value: "unpinned"}, @@ -91,7 +93,8 @@ export default Em.Component.extend({ when: 'before', days: '' } - } + }, + inOptions: this.currentUser ? this.inOptionsForUsers.concat(this.inOptionsForAll) : this.inOptionsForAll }); }, diff --git a/app/assets/javascripts/discourse/templates/components/search-advanced-options.hbs b/app/assets/javascripts/discourse/templates/components/search-advanced-options.hbs index e3ac643ec64..c1c1914b64a 100644 --- a/app/assets/javascripts/discourse/templates/components/search-advanced-options.hbs +++ b/app/assets/javascripts/discourse/templates/components/search-advanced-options.hbs @@ -53,11 +53,13 @@ <div class="control-group pull-left"> <label class="control-label" for="search-in-options">{{i18n "search.advanced.filters.label"}}</label> <div class="controls"> - <section class='field'> - <label>{{input type="checkbox" class="in-likes" checked=searchedTerms.special.in.likes}} {{i18n "search.advanced.filters.likes"}}</label> - <label>{{input type="checkbox" class="in-private" checked=searchedTerms.special.in.private}} {{i18n "search.advanced.filters.private"}}</label> - <label>{{input type="checkbox" class="in-seen" checked=searchedTerms.special.in.seen}} {{i18n "search.advanced.filters.seen"}}</label> - </section> + {{#if currentUser}} + <section class='field'> + <label>{{input type="checkbox" class="in-likes" checked=searchedTerms.special.in.likes}} {{i18n "search.advanced.filters.likes"}}</label> + <label>{{input type="checkbox" class="in-private" checked=searchedTerms.special.in.private}} {{i18n "search.advanced.filters.private"}}</label> + <label>{{input type="checkbox" class="in-seen" checked=searchedTerms.special.in.seen}} {{i18n "search.advanced.filters.seen"}}</label> + </section> + {{/if}} {{combo-box id="in" valueAttribute="value" content=inOptions value=searchedTerms.in none="user.locale.any"}} </div> </div> diff --git a/test/javascripts/acceptance/search-full-test.js.es6 b/test/javascripts/acceptance/search-full-test.js.es6 index b978f8879d5..782d234adc5 100644 --- a/test/javascripts/acceptance/search-full-test.js.es6 +++ b/test/javascripts/acceptance/search-full-test.js.es6 @@ -1,6 +1,7 @@ import { acceptance, waitFor } from "helpers/qunit-helpers"; acceptance("Search - Full Page", { settings: {tagging_enabled: true}, + loggedIn: true, beforeEach() { const response = (object) => { return [ diff --git a/test/javascripts/acceptance/search-test.js.es6 b/test/javascripts/acceptance/search-test.js.es6 index c3d6f11e81b..4322ba1291a 100644 --- a/test/javascripts/acceptance/search-test.js.es6 +++ b/test/javascripts/acceptance/search-test.js.es6 @@ -1,4 +1,4 @@ -import { acceptance } from "helpers/qunit-helpers"; +import { acceptance, logIn } from "helpers/qunit-helpers"; acceptance("Search"); QUnit.test("search", (assert) => { @@ -73,3 +73,53 @@ QUnit.test("Search with context", assert => { assert.ok(!$('.search-context input[type=checkbox]').is(":checked")); }); }); + +QUnit.test("in:likes, in:private, and in:seen filters are hidden to anonymous users", assert => { + visit("/search?expanded=true"); + + andThen(() => { + assert.notOk(exists('.search-advanced-options .in-likes')); + assert.notOk(exists('.search-advanced-options .in-private')); + assert.notOk(exists('.search-advanced-options .in-seen')); + }); +}); + +QUnit.test("in:likes, in:private, and in:seen filters are available to logged in users", assert => { + logIn(); + Discourse.reset(); + visit("/search?expanded=true"); + + andThen(() => { + assert.ok(exists('.search-advanced-options .in-likes')); + assert.ok(exists('.search-advanced-options .in-private')); + assert.ok(exists('.search-advanced-options .in-seen')); + }); +}); + +QUnit.test(`"I've not read", "I posted in", "I'm watching", "I'm tracking", + "I've bookmarked" filters are hidden to anonymous users from the dropdown`, assert => { + visit("/search?expanded=true"); + + andThen(() => { + assert.notOk(exists('select#in option[value=unseen]')); + assert.notOk(exists('select#in option[value=posted]')); + assert.notOk(exists('select#in option[value=watching]')); + assert.notOk(exists('select#in option[value=tracking]')); + assert.notOk(exists('select#in option[value=bookmarks]')); + }); +}); + +QUnit.test(`"I've not read", "I posted in", "I'm watching", "I'm tracking", + "I've bookmarked" filters are available to logged in users in the dropdown`, assert => { + logIn(); + Discourse.reset(); + visit("/search?expanded=true"); + + andThen(() => { + assert.ok(exists('select#in option[value=unseen]')); + assert.ok(exists('select#in option[value=posted]')); + assert.ok(exists('select#in option[value=watching]')); + assert.ok(exists('select#in option[value=tracking]')); + assert.ok(exists('select#in option[value=bookmarks]')); + }); +}); From 9c6c4a77057a8ceae5efaa61b86a5136e305640c Mon Sep 17 00:00:00 2001 From: Kyle Zhao <kzhao.sw@gmail.com> Date: Wed, 9 Aug 2017 04:42:50 -0400 Subject: [PATCH 2/2] restructure search-test to test all filters w/ variable visibiltiy --- .../javascripts/acceptance/search-test.js.es6 | 50 +++++++++---------- 1 file changed, 23 insertions(+), 27 deletions(-) diff --git a/test/javascripts/acceptance/search-test.js.es6 b/test/javascripts/acceptance/search-test.js.es6 index 4322ba1291a..fcd78afe189 100644 --- a/test/javascripts/acceptance/search-test.js.es6 +++ b/test/javascripts/acceptance/search-test.js.es6 @@ -74,52 +74,48 @@ QUnit.test("Search with context", assert => { }); }); -QUnit.test("in:likes, in:private, and in:seen filters are hidden to anonymous users", assert => { +QUnit.test("Right filters are shown to anonymous users", assert => { visit("/search?expanded=true"); andThen(() => { + assert.ok(exists('select#in option[value=first]')); + assert.ok(exists('select#in option[value=pinned]')); + assert.ok(exists('select#in option[value=unpinned]')); + assert.ok(exists('select#in option[value=wiki]')); + assert.ok(exists('select#in option[value=images]')); + + assert.notOk(exists('select#in option[value=unseen]')); + assert.notOk(exists('select#in option[value=posted]')); + assert.notOk(exists('select#in option[value=watching]')); + assert.notOk(exists('select#in option[value=tracking]')); + assert.notOk(exists('select#in option[value=bookmarks]')); + assert.notOk(exists('.search-advanced-options .in-likes')); assert.notOk(exists('.search-advanced-options .in-private')); assert.notOk(exists('.search-advanced-options .in-seen')); }); }); -QUnit.test("in:likes, in:private, and in:seen filters are available to logged in users", assert => { +QUnit.test("Right filters are shown to logged-in users", assert => { logIn(); Discourse.reset(); visit("/search?expanded=true"); andThen(() => { - assert.ok(exists('.search-advanced-options .in-likes')); - assert.ok(exists('.search-advanced-options .in-private')); - assert.ok(exists('.search-advanced-options .in-seen')); - }); -}); + assert.ok(exists('select#in option[value=first]')); + assert.ok(exists('select#in option[value=pinned]')); + assert.ok(exists('select#in option[value=unpinned]')); + assert.ok(exists('select#in option[value=wiki]')); + assert.ok(exists('select#in option[value=images]')); -QUnit.test(`"I've not read", "I posted in", "I'm watching", "I'm tracking", - "I've bookmarked" filters are hidden to anonymous users from the dropdown`, assert => { - visit("/search?expanded=true"); - - andThen(() => { - assert.notOk(exists('select#in option[value=unseen]')); - assert.notOk(exists('select#in option[value=posted]')); - assert.notOk(exists('select#in option[value=watching]')); - assert.notOk(exists('select#in option[value=tracking]')); - assert.notOk(exists('select#in option[value=bookmarks]')); - }); -}); - -QUnit.test(`"I've not read", "I posted in", "I'm watching", "I'm tracking", - "I've bookmarked" filters are available to logged in users in the dropdown`, assert => { - logIn(); - Discourse.reset(); - visit("/search?expanded=true"); - - andThen(() => { assert.ok(exists('select#in option[value=unseen]')); assert.ok(exists('select#in option[value=posted]')); assert.ok(exists('select#in option[value=watching]')); assert.ok(exists('select#in option[value=tracking]')); assert.ok(exists('select#in option[value=bookmarks]')); + + assert.ok(exists('.search-advanced-options .in-likes')); + assert.ok(exists('.search-advanced-options .in-private')); + assert.ok(exists('.search-advanced-options .in-seen')); }); });