FEATURE: allow searching in title in advanced search

Add UI for matching in title only in advanced search options
This commit is contained in:
Sam 2018-05-24 12:34:23 +10:00
parent 11b544ef4e
commit ed08545d1f
3 changed files with 20 additions and 30 deletions

View File

@ -18,6 +18,7 @@ const REGEXP_TAGS_REPLACE = /(^(tags?:|#(?=[a-z0-9\-]+::tag))|::tag\s?$
const REGEXP_IN_MATCH = /^(in|with):(posted|watching|tracking|bookmarks|first|pinned|unpinned|wiki|unseen|image)/ig; const REGEXP_IN_MATCH = /^(in|with):(posted|watching|tracking|bookmarks|first|pinned|unpinned|wiki|unseen|image)/ig;
const REGEXP_SPECIAL_IN_LIKES_MATCH = /^in:likes/ig; const REGEXP_SPECIAL_IN_LIKES_MATCH = /^in:likes/ig;
const REGEXP_SPECIAL_IN_TITLE_MATCH = /^in:title/ig;
const REGEXP_SPECIAL_IN_PRIVATE_MATCH = /^in:private/ig; const REGEXP_SPECIAL_IN_PRIVATE_MATCH = /^in:private/ig;
const REGEXP_SPECIAL_IN_SEEN_MATCH = /^in:seen/ig; const REGEXP_SPECIAL_IN_SEEN_MATCH = /^in:seen/ig;
@ -81,6 +82,7 @@ export default Em.Component.extend({
in: '', in: '',
special: { special: {
in: { in: {
title: false,
likes: false, likes: false,
private: false, private: false,
seen: false seen: false
@ -111,6 +113,7 @@ export default Em.Component.extend({
this.setSearchedTermValueForTags(); this.setSearchedTermValueForTags();
this.setSearchedTermValue('searchedTerms.in', REGEXP_IN_PREFIX, REGEXP_IN_MATCH); this.setSearchedTermValue('searchedTerms.in', REGEXP_IN_PREFIX, REGEXP_IN_MATCH);
this.setSearchedTermSpecialInValue('searchedTerms.special.in.likes', REGEXP_SPECIAL_IN_LIKES_MATCH); this.setSearchedTermSpecialInValue('searchedTerms.special.in.likes', REGEXP_SPECIAL_IN_LIKES_MATCH);
this.setSearchedTermSpecialInValue('searchedTerms.special.in.title', REGEXP_SPECIAL_IN_TITLE_MATCH);
this.setSearchedTermSpecialInValue('searchedTerms.special.in.private', REGEXP_SPECIAL_IN_PRIVATE_MATCH); this.setSearchedTermSpecialInValue('searchedTerms.special.in.private', REGEXP_SPECIAL_IN_PRIVATE_MATCH);
this.setSearchedTermSpecialInValue('searchedTerms.special.in.seen', REGEXP_SPECIAL_IN_SEEN_MATCH); this.setSearchedTermSpecialInValue('searchedTerms.special.in.seen', REGEXP_SPECIAL_IN_SEEN_MATCH);
this.setSearchedTermValue('searchedTerms.status', REGEXP_STATUS_PREFIX); this.setSearchedTermValue('searchedTerms.status', REGEXP_STATUS_PREFIX);
@ -424,15 +427,14 @@ export default Em.Component.extend({
} }
}, },
@observes('searchedTerms.special.in.likes') updateInRegex(regex, filter) {
updateSearchTermForSpecialInLikes() { const match = this.filterBlocks(regex);
const match = this.filterBlocks(REGEXP_SPECIAL_IN_LIKES_MATCH); const inFilter = this.get('searchedTerms.special.in.' + filter);
const inFilter = this.get('searchedTerms.special.in.likes');
let searchTerm = this.get('searchTerm') || ''; let searchTerm = this.get('searchTerm') || '';
if (inFilter) { if (inFilter) {
if (match.length === 0) { if (match.length === 0) {
searchTerm += ` in:likes`; searchTerm += ` in:${filter}`;
this.set('searchTerm', searchTerm.trim()); this.set('searchTerm', searchTerm.trim());
} }
} else if (match.length !== 0) { } else if (match.length !== 0) {
@ -441,38 +443,24 @@ export default Em.Component.extend({
} }
}, },
@observes('searchedTerms.special.in.likes')
updateSearchTermForSpecialInLikes() {
this.updateInRegex(REGEXP_SPECIAL_IN_LIKES_MATCH, 'likes');
},
@observes('searchedTerms.special.in.private') @observes('searchedTerms.special.in.private')
updateSearchTermForSpecialInPrivate() { updateSearchTermForSpecialInPrivate() {
const match = this.filterBlocks(REGEXP_SPECIAL_IN_PRIVATE_MATCH); this.updateInRegex(REGEXP_SPECIAL_IN_PRIVATE_MATCH, 'private');
const inFilter = this.get('searchedTerms.special.in.private');
let searchTerm = this.get('searchTerm') || '';
if (inFilter) {
if (match.length === 0) {
searchTerm += ` in:private`;
this.set('searchTerm', searchTerm.trim());
}
} else if (match.length !== 0) {
searchTerm = searchTerm.replace(match, '');
this.set('searchTerm', searchTerm.trim());
}
}, },
@observes('searchedTerms.special.in.seen') @observes('searchedTerms.special.in.seen')
updateSearchTermForSpecialInSeen() { updateSearchTermForSpecialInSeen() {
const match = this.filterBlocks(REGEXP_SPECIAL_IN_SEEN_MATCH); this.updateInRegex(REGEXP_SPECIAL_IN_SEEN_MATCH, 'seen');
const inFilter = this.get('searchedTerms.special.in.seen'); },
let searchTerm = this.get('searchTerm') || '';
if (inFilter) { @observes('searchedTerms.special.in.title')
if (match.length === 0) { updateSearchTermForSpecialInTitle() {
searchTerm += ` in:seen`; this.updateInRegex(REGEXP_SPECIAL_IN_TITLE_MATCH, 'title');
this.set('searchTerm', searchTerm.trim());
}
} else if (match.length !== 0) {
searchTerm = searchTerm.replace(match, '');
this.set('searchTerm', searchTerm.trim());
}
}, },
@observes('searchedTerms.status') @observes('searchedTerms.status')

View File

@ -60,6 +60,7 @@
<div class="controls"> <div class="controls">
{{#if currentUser}} {{#if currentUser}}
<section class='field'> <section class='field'>
<label>{{input type="checkbox" class="in-likes" checked=searchedTerms.special.in.title}} {{i18n "search.advanced.filters.title"}}</label>
<label>{{input type="checkbox" class="in-likes" checked=searchedTerms.special.in.likes}} {{i18n "search.advanced.filters.likes"}}</label> <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-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> <label>{{input type="checkbox" class="in-seen" checked=searchedTerms.special.in.seen}} {{i18n "search.advanced.filters.seen"}}</label>

View File

@ -1508,6 +1508,7 @@ en:
label: Tagged label: Tagged
filters: filters:
label: Only return topics/posts... label: Only return topics/posts...
title: Matching in title only
likes: I liked likes: I liked
posted: I posted in posted: I posted in
watching: I'm watching watching: I'm watching