|
|
@ -1,35 +1,40 @@
|
|
|
|
import { observes } from 'ember-addons/ember-computed-decorators';
|
|
|
|
import { observes } from 'ember-addons/ember-computed-decorators';
|
|
|
|
|
|
|
|
|
|
|
|
const REGEXP_FILTER_PREFIXES = /\s?(user:|@|category:|#|group:|badge:|tags?:|in:|status:|posts_count:|(before|after):)/ig;
|
|
|
|
const REGEXP_BLOCKS = /(([^" \t\n\x0B\f\r]+)?(("[^"]+")?))/g;
|
|
|
|
|
|
|
|
|
|
|
|
const REGEXP_USERNAME_PREFIX = /\s?(user:|@)/ig;
|
|
|
|
const REGEXP_USERNAME_PREFIX = /(user:|@)/ig;
|
|
|
|
const REGEXP_CATEGORY_PREFIX = /\s?(category:|#)/ig;
|
|
|
|
const REGEXP_CATEGORY_PREFIX = /(category:|#)/ig;
|
|
|
|
const REGEXP_GROUP_PREFIX = /\s?group:/ig;
|
|
|
|
const REGEXP_GROUP_PREFIX = /group:/ig;
|
|
|
|
const REGEXP_BADGE_PREFIX = /\s?badge:/ig;
|
|
|
|
const REGEXP_BADGE_PREFIX = /badge:/ig;
|
|
|
|
const REGEXP_TAGS_PREFIX = /\s?tags?:/ig;
|
|
|
|
const REGEXP_TAGS_PREFIX = /tags?:/ig;
|
|
|
|
const REGEXP_IN_PREFIX = /\s?in:/ig;
|
|
|
|
const REGEXP_IN_PREFIX = /in:/ig;
|
|
|
|
const REGEXP_STATUS_PREFIX = /\s?status:/ig;
|
|
|
|
const REGEXP_STATUS_PREFIX = /status:/ig;
|
|
|
|
const REGEXP_POST_COUNT_PREFIX = /\s?posts_count:/ig;
|
|
|
|
const REGEXP_POST_COUNT_PREFIX = /posts_count:/ig;
|
|
|
|
const REGEXP_POST_TIME_PREFIX = /\s?(before|after):/ig;
|
|
|
|
const REGEXP_POST_TIME_PREFIX = /(before|after):/ig;
|
|
|
|
|
|
|
|
|
|
|
|
const REGEXP_CATEGORY_SLUG = /\s?(\#[a-zA-Z0-9\-:]+)/ig;
|
|
|
|
const REGEXP_IN_MATCH = /in:(posted|watching|tracking|bookmarks|first|pinned|unpinned)/ig;
|
|
|
|
const REGEXP_CATEGORY_ID = /\s?(category:[0-9]+)/ig;
|
|
|
|
const REGEXP_SPECIAL_IN_LIKES_MATCH = /in:likes/ig;
|
|
|
|
const REGEXP_POST_TIME_WHEN = /(before|after)/ig;
|
|
|
|
const REGEXP_SPECIAL_IN_PRIVATE_MATCH = /in:private/ig;
|
|
|
|
|
|
|
|
const REGEXP_SPECIAL_IN_WIKI_MATCH = /in:wiki/ig;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const REGEXP_CATEGORY_SLUG = /(\#[a-zA-Z0-9\-:]+)/ig;
|
|
|
|
|
|
|
|
const REGEXP_CATEGORY_ID = /(category:[0-9]+)/ig;
|
|
|
|
|
|
|
|
const REGEXP_POST_TIME_WHEN = /(before|after)/ig;
|
|
|
|
|
|
|
|
|
|
|
|
export default Em.Component.extend({
|
|
|
|
export default Em.Component.extend({
|
|
|
|
classNames: ['search-advanced-options'],
|
|
|
|
classNames: ['search-advanced-options'],
|
|
|
|
|
|
|
|
|
|
|
|
inOptions: [
|
|
|
|
inOptions: [
|
|
|
|
{name: I18n.t('search.advanced.filters.likes'), value: "likes"},
|
|
|
|
//{name: I18n.t('search.advanced.filters.likes'), value: "likes"},
|
|
|
|
{name: I18n.t('search.advanced.filters.posted'), value: "posted"},
|
|
|
|
{name: I18n.t('search.advanced.filters.posted'), value: "posted"},
|
|
|
|
{name: I18n.t('search.advanced.filters.watching'), value: "watching"},
|
|
|
|
{name: I18n.t('search.advanced.filters.watching'), value: "watching"},
|
|
|
|
{name: I18n.t('search.advanced.filters.tracking'), value: "tracking"},
|
|
|
|
{name: I18n.t('search.advanced.filters.tracking'), value: "tracking"},
|
|
|
|
{name: I18n.t('search.advanced.filters.private'), value: "private"},
|
|
|
|
//{name: I18n.t('search.advanced.filters.private'), value: "private"},
|
|
|
|
{name: I18n.t('search.advanced.filters.bookmarks'), value: "bookmarks"},
|
|
|
|
{name: I18n.t('search.advanced.filters.bookmarks'), value: "bookmarks"},
|
|
|
|
{name: I18n.t('search.advanced.filters.first'), value: "first"},
|
|
|
|
{name: I18n.t('search.advanced.filters.first'), value: "first"},
|
|
|
|
{name: I18n.t('search.advanced.filters.pinned'), value: "pinned"},
|
|
|
|
{name: I18n.t('search.advanced.filters.pinned'), value: "pinned"},
|
|
|
|
{name: I18n.t('search.advanced.filters.unpinned'), value: "unpinned"},
|
|
|
|
{name: I18n.t('search.advanced.filters.unpinned'), value: "unpinned"},
|
|
|
|
{name: I18n.t('search.advanced.filters.wiki'), value: "wiki"}
|
|
|
|
//{name: I18n.t('search.advanced.filters.wiki'), value: "wiki"}
|
|
|
|
],
|
|
|
|
],
|
|
|
|
statusOptions: [
|
|
|
|
statusOptions: [
|
|
|
|
{name: I18n.t('search.advanced.statuses.open'), value: "open"},
|
|
|
|
{name: I18n.t('search.advanced.statuses.open'), value: "open"},
|
|
|
@ -57,12 +62,19 @@ export default Em.Component.extend({
|
|
|
|
_init() {
|
|
|
|
_init() {
|
|
|
|
this.setProperties({
|
|
|
|
this.setProperties({
|
|
|
|
searchedTerms: {
|
|
|
|
searchedTerms: {
|
|
|
|
username: null,
|
|
|
|
username: '',
|
|
|
|
category: null,
|
|
|
|
category: null,
|
|
|
|
group: [],
|
|
|
|
group: [],
|
|
|
|
badge: [],
|
|
|
|
badge: [],
|
|
|
|
tags: [],
|
|
|
|
tags: [],
|
|
|
|
in: '',
|
|
|
|
in: '',
|
|
|
|
|
|
|
|
special: {
|
|
|
|
|
|
|
|
in: {
|
|
|
|
|
|
|
|
likes: false,
|
|
|
|
|
|
|
|
private: false,
|
|
|
|
|
|
|
|
wiki: false
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
status: '',
|
|
|
|
status: '',
|
|
|
|
posts_count: '',
|
|
|
|
posts_count: '',
|
|
|
|
time: {
|
|
|
|
time: {
|
|
|
@ -74,107 +86,207 @@ export default Em.Component.extend({
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
_update() {
|
|
|
|
_update() {
|
|
|
|
let searchTerm = this.get('searchTerm');
|
|
|
|
if (!this.get('searchTerm')) {
|
|
|
|
|
|
|
|
|
|
|
|
if (!searchTerm) {
|
|
|
|
|
|
|
|
this._init();
|
|
|
|
this._init();
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
this.findUsername(searchTerm);
|
|
|
|
this.findSearchTerms();
|
|
|
|
this.findCategory(searchTerm);
|
|
|
|
this.setSearchedTermValue('searchedTerms.username', REGEXP_USERNAME_PREFIX);
|
|
|
|
this.findGroup(searchTerm);
|
|
|
|
this.setSearchedTermValueForCategory();
|
|
|
|
this.findBadge(searchTerm);
|
|
|
|
this.setSearchedTermValueForGroup();
|
|
|
|
this.findTags(searchTerm);
|
|
|
|
this.setSearchedTermValueForBadge();
|
|
|
|
this.findIn(searchTerm);
|
|
|
|
this.setSearchedTermValueForTags();
|
|
|
|
this.findStatus(searchTerm);
|
|
|
|
this.setSearchedTermValue('searchedTerms.in', REGEXP_IN_PREFIX, REGEXP_IN_MATCH);
|
|
|
|
this.findPostsCount(searchTerm);
|
|
|
|
this.setSearchedTermSpecialInValue('searchedTerms.special.in.likes', REGEXP_SPECIAL_IN_LIKES_MATCH);
|
|
|
|
this.findPostTime(searchTerm);
|
|
|
|
this.setSearchedTermSpecialInValue('searchedTerms.special.in.private', REGEXP_SPECIAL_IN_PRIVATE_MATCH);
|
|
|
|
|
|
|
|
this.setSearchedTermSpecialInValue('searchedTerms.special.in.wiki', REGEXP_SPECIAL_IN_WIKI_MATCH);
|
|
|
|
|
|
|
|
this.setSearchedTermValue('searchedTerms.status', REGEXP_STATUS_PREFIX);
|
|
|
|
|
|
|
|
this.setSearchedTermValueForPostTime();
|
|
|
|
|
|
|
|
this.setSearchedTermValue('searchedTerms.posts_count', REGEXP_POST_COUNT_PREFIX);
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
findSearchTerm(EXPRESSION, searchTerm) {
|
|
|
|
findSearchTerms() {
|
|
|
|
|
|
|
|
const searchTerm = this.get('searchTerm');
|
|
|
|
if (!searchTerm)
|
|
|
|
if (!searchTerm)
|
|
|
|
return "";
|
|
|
|
return [];
|
|
|
|
|
|
|
|
|
|
|
|
const expressionPosition = searchTerm.search(EXPRESSION);
|
|
|
|
const blocks = searchTerm.match(REGEXP_BLOCKS);
|
|
|
|
if (expressionPosition === -1)
|
|
|
|
if (!blocks) return [];
|
|
|
|
return "";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const remainingPhrases = searchTerm.substring(expressionPosition + 2);
|
|
|
|
let result = [];
|
|
|
|
let nextExpressionPosition = remainingPhrases.search(REGEXP_FILTER_PREFIXES);
|
|
|
|
blocks.forEach(block => {
|
|
|
|
if (nextExpressionPosition === -1)
|
|
|
|
if (block.length !== 0)
|
|
|
|
nextExpressionPosition = remainingPhrases.length;
|
|
|
|
result.push(block);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
return searchTerm.substring(expressionPosition, nextExpressionPosition + expressionPosition + 2).trim().split(' ')[0];
|
|
|
|
this.set('searchTermBlocks', result);
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
findUsername(searchTerm) {
|
|
|
|
filterBlocks(regexPrefix) {
|
|
|
|
const match = this.findSearchTerm(REGEXP_USERNAME_PREFIX, searchTerm);
|
|
|
|
const blocks = this.get('searchTermBlocks');
|
|
|
|
|
|
|
|
if (!blocks) return [];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let result = [];
|
|
|
|
|
|
|
|
blocks.forEach(block => {
|
|
|
|
|
|
|
|
if (block.search(regexPrefix) !== -1)
|
|
|
|
|
|
|
|
result.push(block);
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return result;
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
setSearchedTermValue(key, replaceRegEx, matchRegEx = null) {
|
|
|
|
|
|
|
|
matchRegEx = matchRegEx || replaceRegEx;
|
|
|
|
|
|
|
|
const match = this.filterBlocks(matchRegEx);
|
|
|
|
|
|
|
|
|
|
|
|
if (match.length !== 0) {
|
|
|
|
if (match.length !== 0) {
|
|
|
|
let userInput = match.replace(REGEXP_USERNAME_PREFIX, '');
|
|
|
|
const userInput = match[0].replace(replaceRegEx, '');
|
|
|
|
|
|
|
|
if (this.get(key) !== userInput) {
|
|
|
|
if (userInput.length !== 0 && this.get('searchedTerms.username') !== userInput) {
|
|
|
|
this.set(key, userInput);
|
|
|
|
this.set('searchedTerms.username', userInput);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
} else if(this.get(key).length !== 0) {
|
|
|
|
this.set('searchedTerms.username', null);
|
|
|
|
this.set(key, '');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
@observes('searchedTerms.username')
|
|
|
|
setSearchedTermSpecialInValue(key, replaceRegEx) {
|
|
|
|
updateUsername() {
|
|
|
|
const match = this.filterBlocks(replaceRegEx);
|
|
|
|
let searchTerm = this.get('searchTerm');
|
|
|
|
|
|
|
|
const match = this.findSearchTerm(REGEXP_USERNAME_PREFIX, searchTerm);
|
|
|
|
|
|
|
|
const userFilter = this.get('searchedTerms.username');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (userFilter && userFilter.length !== 0) {
|
|
|
|
if (match.length !== 0) {
|
|
|
|
if (match.length !== 0) {
|
|
|
|
if (this.get(key) !== true) {
|
|
|
|
searchTerm = searchTerm.replace(match, `@${userFilter}`);
|
|
|
|
this.set(key, true);
|
|
|
|
} else {
|
|
|
|
|
|
|
|
searchTerm += ` @${userFilter}`;
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else if (match.length !== 0) {
|
|
|
|
} else if(this.get(key) !== false) {
|
|
|
|
searchTerm = searchTerm.replace(match, '');
|
|
|
|
this.set(key, false);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
this.set('searchTerm', searchTerm);
|
|
|
|
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
findCategory(searchTerm) {
|
|
|
|
setSearchedTermValueForCategory() {
|
|
|
|
const match = this.findSearchTerm(REGEXP_CATEGORY_PREFIX, searchTerm);
|
|
|
|
const match = this.filterBlocks(REGEXP_CATEGORY_PREFIX);
|
|
|
|
if (match.length !== 0) {
|
|
|
|
if (match.length !== 0) {
|
|
|
|
let existingInput = _.isArray(this.get('searchedTerms.category')) ? this.get('searchedTerms.category')[0] : this.get('searchedTerms.category');
|
|
|
|
const existingInput = this.get('searchedTerms.category');
|
|
|
|
const subcategories = match.replace(REGEXP_CATEGORY_PREFIX, '').split(':');
|
|
|
|
const subcategories = match[0].replace(REGEXP_CATEGORY_PREFIX, '').split(':');
|
|
|
|
if (subcategories.length > 1) {
|
|
|
|
if (subcategories.length > 1) {
|
|
|
|
let userInput = Discourse.Category.findBySlug(subcategories[1], subcategories[0]);
|
|
|
|
const userInput = Discourse.Category.findBySlug(subcategories[1], subcategories[0]);
|
|
|
|
if ((!existingInput && userInput)
|
|
|
|
if ((!existingInput && userInput)
|
|
|
|
|| (existingInput && userInput && existingInput.id !== userInput.id))
|
|
|
|
|| (existingInput && userInput && existingInput.id !== userInput.id))
|
|
|
|
this.set('searchedTerms.category', userInput.id);
|
|
|
|
this.set('searchedTerms.category', userInput.id);
|
|
|
|
} else
|
|
|
|
} else
|
|
|
|
if (isNaN(subcategories)) {
|
|
|
|
if (isNaN(subcategories)) {
|
|
|
|
let userInput = Discourse.Category.findSingleBySlug(subcategories[0]);
|
|
|
|
const userInput = Discourse.Category.findSingleBySlug(subcategories[0]);
|
|
|
|
if ((!existingInput && userInput)
|
|
|
|
if ((!existingInput && userInput)
|
|
|
|
|| (existingInput && userInput && existingInput.id !== userInput.id))
|
|
|
|
|| (existingInput && userInput && existingInput.id !== userInput.id))
|
|
|
|
this.set('searchedTerms.category', userInput.id);
|
|
|
|
this.set('searchedTerms.category', userInput.id);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
let userInput = Discourse.Category.findById(subcategories[0]);
|
|
|
|
const userInput = Discourse.Category.findById(subcategories[0]);
|
|
|
|
if ((!existingInput && userInput)
|
|
|
|
if ((!existingInput && userInput)
|
|
|
|
|| (existingInput && userInput && existingInput.id !== userInput.id))
|
|
|
|
|| (existingInput && userInput && existingInput.id !== userInput.id))
|
|
|
|
this.set('searchedTerms.category', userInput.id);
|
|
|
|
this.set('searchedTerms.category', userInput.id);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else
|
|
|
|
} else
|
|
|
|
this.set('searchedTerms.category', null);
|
|
|
|
this.set('searchedTerms.category', null);
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
@observes('searchedTerms.category')
|
|
|
|
setSearchedTermValueForGroup() {
|
|
|
|
updateCategory() {
|
|
|
|
const match = this.filterBlocks(REGEXP_GROUP_PREFIX);
|
|
|
|
let searchTerm = this.get('searchTerm');
|
|
|
|
const group = this.get('searchedTerms.group');
|
|
|
|
const categoryFilter = Discourse.Category.findById(this.get('searchedTerms.category'));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const match = this.findSearchTerm(REGEXP_CATEGORY_PREFIX, searchTerm);
|
|
|
|
if (match.length !== 0) {
|
|
|
|
const slugCategoryMatches = match.match(REGEXP_CATEGORY_SLUG);
|
|
|
|
const existingInput = _.isArray(group) ? group[0] : group;
|
|
|
|
const idCategoryMatches = match.match(REGEXP_CATEGORY_ID);
|
|
|
|
const userInput = match[0].replace(REGEXP_GROUP_PREFIX, '');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (existingInput !== userInput) {
|
|
|
|
|
|
|
|
this.set('searchedTerms.group', (userInput.length !== 0) ? [userInput] : []);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else if (group.length !== 0) {
|
|
|
|
|
|
|
|
this.set('searchedTerms.group', []);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
setSearchedTermValueForBadge() {
|
|
|
|
|
|
|
|
const match = this.filterBlocks(REGEXP_BADGE_PREFIX);
|
|
|
|
|
|
|
|
const badge = this.get('searchedTerms.badge');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (match.length !== 0) {
|
|
|
|
|
|
|
|
const existingInput = _.isArray(badge) ? badge[0] : badge;
|
|
|
|
|
|
|
|
const userInput = match[0].replace(REGEXP_BADGE_PREFIX, '');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (existingInput !== userInput) {
|
|
|
|
|
|
|
|
this.set('searchedTerms.badge', (userInput.length !== 0) ? [userInput] : []);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else if (badge.length !== 0) {
|
|
|
|
|
|
|
|
this.set('searchedTerms.badge', []);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
setSearchedTermValueForTags() {
|
|
|
|
|
|
|
|
if (!this.siteSettings.tagging_enabled) return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const match = this.filterBlocks(REGEXP_TAGS_PREFIX);
|
|
|
|
|
|
|
|
const tags = this.get('searchedTerms.tags');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (match.length !== 0) {
|
|
|
|
|
|
|
|
const existingInput = _.isArray(tags) ? tags.join(',') : tags;
|
|
|
|
|
|
|
|
const userInput = match[0].replace(REGEXP_TAGS_PREFIX, '');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (existingInput !== userInput) {
|
|
|
|
|
|
|
|
this.set('searchedTerms.tags', (userInput.length !== 0) ? userInput.split(',') : []);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else if (tags.length !== 0) {
|
|
|
|
|
|
|
|
this.set('searchedTerms.tags', []);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
setSearchedTermValueForPostTime() {
|
|
|
|
|
|
|
|
const match = this.filterBlocks(REGEXP_POST_TIME_PREFIX);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (match.length !== 0) {
|
|
|
|
|
|
|
|
const existingInputWhen = this.get('searchedTerms.time.when');
|
|
|
|
|
|
|
|
const userInputWhen = match[0].match(REGEXP_POST_TIME_WHEN)[0];
|
|
|
|
|
|
|
|
const existingInputDays = this.get('searchedTerms.time.days');
|
|
|
|
|
|
|
|
const userInputDays = match[0].replace(REGEXP_POST_TIME_PREFIX, '');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (existingInputWhen !== userInputWhen) {
|
|
|
|
|
|
|
|
this.set('searchedTerms.time.when', userInputWhen);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (existingInputDays !== userInputDays) {
|
|
|
|
|
|
|
|
this.set('searchedTerms.time.days', userInputDays);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
this.set('searchedTerms.time.days', '');
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@observes('searchedTerms.username')
|
|
|
|
|
|
|
|
updateSearchTermForUsername() {
|
|
|
|
|
|
|
|
const match = this.filterBlocks(REGEXP_USERNAME_PREFIX);
|
|
|
|
|
|
|
|
const userFilter = this.get('searchedTerms.username');
|
|
|
|
|
|
|
|
let searchTerm = this.get('searchTerm') || '';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (userFilter && userFilter.length !== 0) {
|
|
|
|
|
|
|
|
if (match.length !== 0) {
|
|
|
|
|
|
|
|
searchTerm = searchTerm.replace(match[0], `@${userFilter}`);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
searchTerm += ` @${userFilter}`;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.set('searchTerm', searchTerm.trim());
|
|
|
|
|
|
|
|
} else if (match.length !== 0) {
|
|
|
|
|
|
|
|
searchTerm = searchTerm.replace(match[0], '');
|
|
|
|
|
|
|
|
this.set('searchTerm', searchTerm.trim());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@observes('searchedTerms.category')
|
|
|
|
|
|
|
|
updateSearchTermForCategory() {
|
|
|
|
|
|
|
|
const match = this.filterBlocks(REGEXP_CATEGORY_PREFIX);
|
|
|
|
|
|
|
|
const categoryFilter = Discourse.Category.findById(this.get('searchedTerms.category'));
|
|
|
|
|
|
|
|
let searchTerm = this.get('searchTerm') || '';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const slugCategoryMatches = (match.length !== 0) ? match[0].match(REGEXP_CATEGORY_SLUG) : null;
|
|
|
|
|
|
|
|
const idCategoryMatches = (match.length !== 0) ? match[0].match(REGEXP_CATEGORY_ID) : null;
|
|
|
|
if (categoryFilter && categoryFilter.length !== 0) {
|
|
|
|
if (categoryFilter && categoryFilter.length !== 0) {
|
|
|
|
const id = categoryFilter.id;
|
|
|
|
const id = categoryFilter.id;
|
|
|
|
const slug = categoryFilter.slug;
|
|
|
|
const slug = categoryFilter.slug;
|
|
|
@ -186,6 +298,8 @@ export default Em.Component.extend({
|
|
|
|
searchTerm = searchTerm.replace(idCategoryMatches[0], `category:${id}`);
|
|
|
|
searchTerm = searchTerm.replace(idCategoryMatches[0], `category:${id}`);
|
|
|
|
else
|
|
|
|
else
|
|
|
|
searchTerm += ` #${parentSlug}:${slug}`;
|
|
|
|
searchTerm += ` #${parentSlug}:${slug}`;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.set('searchTerm', searchTerm.trim());
|
|
|
|
} else if (categoryFilter) {
|
|
|
|
} else if (categoryFilter) {
|
|
|
|
if (slugCategoryMatches)
|
|
|
|
if (slugCategoryMatches)
|
|
|
|
searchTerm = searchTerm.replace(slugCategoryMatches[0], `#${slug}`);
|
|
|
|
searchTerm = searchTerm.replace(slugCategoryMatches[0], `#${slug}`);
|
|
|
@ -193,264 +307,210 @@ export default Em.Component.extend({
|
|
|
|
searchTerm = searchTerm.replace(idCategoryMatches[0], `category:${id}`);
|
|
|
|
searchTerm = searchTerm.replace(idCategoryMatches[0], `category:${id}`);
|
|
|
|
else
|
|
|
|
else
|
|
|
|
searchTerm += ` #${slug}`;
|
|
|
|
searchTerm += ` #${slug}`;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.set('searchTerm', searchTerm.trim());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
if (slugCategoryMatches)
|
|
|
|
if (slugCategoryMatches)
|
|
|
|
searchTerm = searchTerm.replace(slugCategoryMatches[0], '');
|
|
|
|
searchTerm = searchTerm.replace(slugCategoryMatches[0], '');
|
|
|
|
if (idCategoryMatches)
|
|
|
|
if (idCategoryMatches)
|
|
|
|
searchTerm = searchTerm.replace(idCategoryMatches[0], '');
|
|
|
|
searchTerm = searchTerm.replace(idCategoryMatches[0], '');
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.set('searchTerm', searchTerm);
|
|
|
|
this.set('searchTerm', searchTerm.trim());
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
findGroup(searchTerm) {
|
|
|
|
|
|
|
|
const match = this.findSearchTerm(REGEXP_GROUP_PREFIX, searchTerm);
|
|
|
|
|
|
|
|
const group = this.get('searchedTerms.group');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (match.length !== 0) {
|
|
|
|
|
|
|
|
let existingInput = _.isArray(group) ? group[0] : group;
|
|
|
|
|
|
|
|
let userInput = match.replace(REGEXP_GROUP_PREFIX, '');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (userInput.length !== 0 && existingInput !== userInput) {
|
|
|
|
|
|
|
|
this.set('searchedTerms.group', [userInput]);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else if (group.length !== 0) {
|
|
|
|
|
|
|
|
this.set('searchedTerms.group', []);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
@observes('searchedTerms.group')
|
|
|
|
@observes('searchedTerms.group')
|
|
|
|
updateGroup() {
|
|
|
|
updateSearchTermForGroup() {
|
|
|
|
let searchTerm = this.get('searchTerm');
|
|
|
|
const match = this.filterBlocks(REGEXP_GROUP_PREFIX);
|
|
|
|
const match = this.findSearchTerm(REGEXP_GROUP_PREFIX, searchTerm);
|
|
|
|
|
|
|
|
const groupFilter = this.get('searchedTerms.group');
|
|
|
|
const groupFilter = this.get('searchedTerms.group');
|
|
|
|
|
|
|
|
let searchTerm = this.get('searchTerm') || '';
|
|
|
|
|
|
|
|
|
|
|
|
if (groupFilter && groupFilter.length !== 0) {
|
|
|
|
if (groupFilter && groupFilter.length !== 0) {
|
|
|
|
if (match.length !== 0) {
|
|
|
|
if (match.length !== 0) {
|
|
|
|
searchTerm = searchTerm.replace(match, ` group:${groupFilter}`);
|
|
|
|
searchTerm = searchTerm.replace(match[0], ` group:${groupFilter}`);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
searchTerm += ` group:${groupFilter}`;
|
|
|
|
searchTerm += ` group:${groupFilter}`;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
this.set('searchTerm', searchTerm);
|
|
|
|
this.set('searchTerm', searchTerm);
|
|
|
|
} else if (match.length !== 0) {
|
|
|
|
} else if (match.length !== 0) {
|
|
|
|
searchTerm = searchTerm.replace(match, '');
|
|
|
|
searchTerm = searchTerm.replace(match[0], '');
|
|
|
|
this.set('searchTerm', searchTerm);
|
|
|
|
this.set('searchTerm', searchTerm.trim());
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
findBadge(searchTerm) {
|
|
|
|
|
|
|
|
const match = this.findSearchTerm(REGEXP_BADGE_PREFIX, searchTerm);
|
|
|
|
|
|
|
|
const badge = this.get('searchedTerms.badge');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (match.length !== 0) {
|
|
|
|
|
|
|
|
let existingInput = _.isArray(badge) ? badge[0] : badge;
|
|
|
|
|
|
|
|
let userInput = match.replace(REGEXP_BADGE_PREFIX, '');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (userInput.length !== 0 && existingInput !== userInput) {
|
|
|
|
|
|
|
|
this.set('searchedTerms.badge', [match.replace(REGEXP_BADGE_PREFIX, '')]);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else if (badge.length !== 0) {
|
|
|
|
|
|
|
|
this.set('searchedTerms.badge', []);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
@observes('searchedTerms.badge')
|
|
|
|
@observes('searchedTerms.badge')
|
|
|
|
updateBadge() {
|
|
|
|
updateSearchTermForBadge() {
|
|
|
|
let searchTerm = this.get('searchTerm');
|
|
|
|
const match = this.filterBlocks(REGEXP_BADGE_PREFIX);
|
|
|
|
|
|
|
|
|
|
|
|
const match = this.findSearchTerm(REGEXP_BADGE_PREFIX, searchTerm);
|
|
|
|
|
|
|
|
const badgeFilter = this.get('searchedTerms.badge');
|
|
|
|
const badgeFilter = this.get('searchedTerms.badge');
|
|
|
|
|
|
|
|
let searchTerm = this.get('searchTerm') || '';
|
|
|
|
|
|
|
|
|
|
|
|
if (badgeFilter && badgeFilter.length !== 0) {
|
|
|
|
if (badgeFilter && badgeFilter.length !== 0) {
|
|
|
|
if (match.length !== 0) {
|
|
|
|
if (match.length !== 0) {
|
|
|
|
searchTerm = searchTerm.replace(match, ` badge:${badgeFilter}`);
|
|
|
|
searchTerm = searchTerm.replace(match[0], ` badge:${badgeFilter}`);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
searchTerm += ` badge:${badgeFilter}`;
|
|
|
|
searchTerm += ` badge:${badgeFilter}`;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
this.set('searchTerm', searchTerm);
|
|
|
|
this.set('searchTerm', searchTerm);
|
|
|
|
} else if (match.length !== 0) {
|
|
|
|
} else if (match.length !== 0) {
|
|
|
|
searchTerm = searchTerm.replace(match, '');
|
|
|
|
searchTerm = searchTerm.replace(match[0], '');
|
|
|
|
this.set('searchTerm', searchTerm);
|
|
|
|
this.set('searchTerm', searchTerm.trim());
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
findTags(searchTerm) {
|
|
|
|
|
|
|
|
if (!this.siteSettings.tagging_enabled) return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const match = this.findSearchTerm(REGEXP_TAGS_PREFIX, searchTerm);
|
|
|
|
|
|
|
|
const tags = this.get('searchedTerms.tags');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (match.length !== 0) {
|
|
|
|
|
|
|
|
let existingInput = _.isArray(tags) ? tags.join(',') : tags;
|
|
|
|
|
|
|
|
let userInput = match.replace(REGEXP_TAGS_PREFIX, '');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (userInput.length !== 0 && existingInput !== userInput) {
|
|
|
|
|
|
|
|
this.set('searchedTerms.tags', userInput.split(','));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else if (tags.length !== 0) {
|
|
|
|
|
|
|
|
this.set('searchedTerms.tags', []);
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
@observes('searchedTerms.tags')
|
|
|
|
@observes('searchedTerms.tags')
|
|
|
|
updateTags() {
|
|
|
|
updateSearchTermForTags() {
|
|
|
|
let searchTerm = this.get('searchTerm');
|
|
|
|
const match = this.filterBlocks(REGEXP_TAGS_PREFIX);
|
|
|
|
const match = this.findSearchTerm(REGEXP_TAGS_PREFIX, searchTerm);
|
|
|
|
|
|
|
|
const tagFilter = this.get('searchedTerms.tags');
|
|
|
|
const tagFilter = this.get('searchedTerms.tags');
|
|
|
|
|
|
|
|
let searchTerm = this.get('searchTerm') || '';
|
|
|
|
|
|
|
|
|
|
|
|
if (tagFilter && tagFilter.length !== 0) {
|
|
|
|
if (tagFilter && tagFilter.length !== 0) {
|
|
|
|
const tags = tagFilter.join(',');
|
|
|
|
const tags = tagFilter.join(',');
|
|
|
|
|
|
|
|
|
|
|
|
if (match.length !== 0) {
|
|
|
|
if (match.length !== 0) {
|
|
|
|
searchTerm = searchTerm.replace(match, `tags:${tags}`);
|
|
|
|
searchTerm = searchTerm.replace(match[0], `tags:${tags}`);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
searchTerm += ` tags:${tags}`;
|
|
|
|
searchTerm += ` tags:${tags}`;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
this.set('searchTerm', searchTerm);
|
|
|
|
this.set('searchTerm', searchTerm.trim());
|
|
|
|
} else if (match.length !== 0) {
|
|
|
|
} else if (match.length !== 0) {
|
|
|
|
searchTerm = searchTerm.replace(match, '');
|
|
|
|
searchTerm = searchTerm.replace(match[0], '');
|
|
|
|
this.set('searchTerm', searchTerm);
|
|
|
|
this.set('searchTerm', searchTerm.trim());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
findIn(searchTerm) {
|
|
|
|
|
|
|
|
const match = this.findSearchTerm(REGEXP_IN_PREFIX, searchTerm);
|
|
|
|
|
|
|
|
if (match.length !== 0) {
|
|
|
|
|
|
|
|
let existingInput = this.get('searchedTerms.in');
|
|
|
|
|
|
|
|
let userInput = match.replace(REGEXP_IN_PREFIX, '');
|
|
|
|
|
|
|
|
if (userInput.length !== 0 && existingInput !== userInput)
|
|
|
|
|
|
|
|
this.set('searchedTerms.in', userInput);
|
|
|
|
|
|
|
|
} else
|
|
|
|
|
|
|
|
this.set('searchedTerms.in', '');
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@observes('searchedTerms.in')
|
|
|
|
@observes('searchedTerms.in')
|
|
|
|
updateIn() {
|
|
|
|
updateSearchTermForIn() {
|
|
|
|
let searchTerm = this.get('searchTerm');
|
|
|
|
const match = this.filterBlocks(REGEXP_IN_MATCH);
|
|
|
|
const match = this.findSearchTerm(REGEXP_IN_PREFIX, searchTerm);
|
|
|
|
|
|
|
|
const inFilter = this.get('searchedTerms.in');
|
|
|
|
const inFilter = this.get('searchedTerms.in');
|
|
|
|
|
|
|
|
let searchTerm = this.get('searchTerm') || '';
|
|
|
|
|
|
|
|
|
|
|
|
if (inFilter) {
|
|
|
|
if (inFilter) {
|
|
|
|
if (match.length !== 0) {
|
|
|
|
if (match.length !== 0) {
|
|
|
|
searchTerm = searchTerm.replace(match, `in:${inFilter}`);
|
|
|
|
searchTerm = searchTerm.replace(match[0], `in:${inFilter}`);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
searchTerm += ` in:${inFilter}`;
|
|
|
|
searchTerm += ` in:${inFilter}`;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
this.set('searchTerm', searchTerm);
|
|
|
|
this.set('searchTerm', searchTerm.trim());
|
|
|
|
} else if (match.length !== 0) {
|
|
|
|
} else if (match.length !== 0) {
|
|
|
|
searchTerm = searchTerm.replace(match, '');
|
|
|
|
searchTerm = searchTerm.replace(match, '');
|
|
|
|
this.set('searchTerm', searchTerm);
|
|
|
|
this.set('searchTerm', searchTerm.trim());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
findStatus(searchTerm) {
|
|
|
|
@observes('searchedTerms.special.in.likes')
|
|
|
|
const match = this.findSearchTerm(REGEXP_STATUS_PREFIX, searchTerm);
|
|
|
|
updateSearchTermForSpecialInLikes() {
|
|
|
|
if (match.length !== 0) {
|
|
|
|
const match = this.filterBlocks(REGEXP_SPECIAL_IN_LIKES_MATCH);
|
|
|
|
let existingInput = this.get('searchedTerms.status');
|
|
|
|
const inFilter = this.get('searchedTerms.special.in.likes');
|
|
|
|
let userInput = match.replace(REGEXP_STATUS_PREFIX, '');
|
|
|
|
let searchTerm = this.get('searchTerm') || '';
|
|
|
|
if (userInput.length !== 0 && existingInput !== userInput)
|
|
|
|
|
|
|
|
this.set('searchedTerms.status', userInput);
|
|
|
|
if (inFilter) {
|
|
|
|
} else
|
|
|
|
if (match.length === 0) {
|
|
|
|
this.set('searchedTerms.status', '');
|
|
|
|
searchTerm += ` in:likes`;
|
|
|
|
|
|
|
|
this.set('searchTerm', searchTerm.trim());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else if (match.length !== 0) {
|
|
|
|
|
|
|
|
searchTerm = searchTerm.replace(match, '');
|
|
|
|
|
|
|
|
this.set('searchTerm', searchTerm.trim());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@observes('searchedTerms.special.in.private')
|
|
|
|
|
|
|
|
updateSearchTermForSpecialInPrivate() {
|
|
|
|
|
|
|
|
const match = this.filterBlocks(REGEXP_SPECIAL_IN_PRIVATE_MATCH);
|
|
|
|
|
|
|
|
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.wiki')
|
|
|
|
|
|
|
|
updateSearchTermForSpecialInWiki() {
|
|
|
|
|
|
|
|
const match = this.filterBlocks(REGEXP_SPECIAL_IN_WIKI_MATCH);
|
|
|
|
|
|
|
|
const inFilter = this.get('searchedTerms.special.in.wiki');
|
|
|
|
|
|
|
|
let searchTerm = this.get('searchTerm') || '';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (inFilter) {
|
|
|
|
|
|
|
|
if (match.length === 0) {
|
|
|
|
|
|
|
|
searchTerm += ` in:wiki`;
|
|
|
|
|
|
|
|
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')
|
|
|
|
updateStatus() {
|
|
|
|
updateSearchTermForStatus() {
|
|
|
|
let searchTerm = this.get('searchTerm');
|
|
|
|
const match = this.filterBlocks(REGEXP_STATUS_PREFIX);
|
|
|
|
const match = this.findSearchTerm(REGEXP_STATUS_PREFIX, searchTerm);
|
|
|
|
|
|
|
|
const statusFilter = this.get('searchedTerms.status');
|
|
|
|
const statusFilter = this.get('searchedTerms.status');
|
|
|
|
|
|
|
|
let searchTerm = this.get('searchTerm') || '';
|
|
|
|
|
|
|
|
|
|
|
|
if (statusFilter) {
|
|
|
|
if (statusFilter) {
|
|
|
|
if (match.length !== 0) {
|
|
|
|
if (match.length !== 0) {
|
|
|
|
searchTerm = searchTerm.replace(match, `status:${statusFilter}`);
|
|
|
|
searchTerm = searchTerm.replace(match[0], `status:${statusFilter}`);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
searchTerm += ` status:${statusFilter}`;
|
|
|
|
searchTerm += ` status:${statusFilter}`;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
this.set('searchTerm', searchTerm);
|
|
|
|
this.set('searchTerm', searchTerm.trim());
|
|
|
|
} else if (match.length !== 0) {
|
|
|
|
} else if (match.length !== 0) {
|
|
|
|
searchTerm = searchTerm.replace(match, '');
|
|
|
|
searchTerm = searchTerm.replace(match[0], '');
|
|
|
|
this.set('searchTerm', searchTerm);
|
|
|
|
this.set('searchTerm', searchTerm.trim());
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
findPostsCount(searchTerm) {
|
|
|
|
|
|
|
|
const match = this.findSearchTerm(REGEXP_POST_COUNT_PREFIX, searchTerm);
|
|
|
|
|
|
|
|
if (match.length !== 0) {
|
|
|
|
|
|
|
|
let existingInput = this.get('searchedTerms.posts_count');
|
|
|
|
|
|
|
|
let userInput = match.replace(REGEXP_POST_COUNT_PREFIX, '');
|
|
|
|
|
|
|
|
if (userInput.length !== 0 && existingInput !== userInput)
|
|
|
|
|
|
|
|
this.set('searchedTerms.posts_count', userInput);
|
|
|
|
|
|
|
|
} else
|
|
|
|
|
|
|
|
this.set('searchedTerms.posts_count', '');
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@observes('searchedTerms.posts_count')
|
|
|
|
|
|
|
|
updatePostsCount() {
|
|
|
|
|
|
|
|
let searchTerm = this.get('searchTerm');
|
|
|
|
|
|
|
|
const match = this.findSearchTerm(REGEXP_POST_COUNT_PREFIX, searchTerm);
|
|
|
|
|
|
|
|
const postsCountFilter = this.get('searchedTerms.posts_count');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (postsCountFilter) {
|
|
|
|
|
|
|
|
if (match.length !== 0) {
|
|
|
|
|
|
|
|
searchTerm = searchTerm.replace(match, `posts_count:${postsCountFilter}`);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
searchTerm += ` posts_count:${postsCountFilter}`;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.set('searchTerm', searchTerm);
|
|
|
|
|
|
|
|
} else if (match.length !== 0) {
|
|
|
|
|
|
|
|
searchTerm = searchTerm.replace(match, '');
|
|
|
|
|
|
|
|
this.set('searchTerm', searchTerm);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
findPostTime(searchTerm) {
|
|
|
|
|
|
|
|
const match = this.findSearchTerm(REGEXP_POST_TIME_WHEN, searchTerm);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (match.length !== 0) {
|
|
|
|
|
|
|
|
let existingInputWhen = this.get('searchedTerms.time.when');
|
|
|
|
|
|
|
|
let userInputWhen = match.match(REGEXP_POST_TIME_WHEN)[0];
|
|
|
|
|
|
|
|
let existingInputDays = this.get('searchedTerms.time.days');
|
|
|
|
|
|
|
|
let userInputDays = match.replace(REGEXP_POST_TIME_PREFIX, '');
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (userInputWhen.length !== 0 && existingInputWhen !== userInputWhen) {
|
|
|
|
|
|
|
|
this.set('searchedTerms.time.when', userInputWhen);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (userInputDays.length !== 0 &&
|
|
|
|
|
|
|
|
existingInputDays !== userInputDays &&
|
|
|
|
|
|
|
|
userInputDays !== match) {
|
|
|
|
|
|
|
|
this.set('searchedTerms.time.days', userInputDays);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
this.set('searchedTerms.time.days', '');
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
@observes('searchedTerms.time.when', 'searchedTerms.time.days')
|
|
|
|
@observes('searchedTerms.time.when', 'searchedTerms.time.days')
|
|
|
|
updatePostTime() {
|
|
|
|
updateSearchTermForPostTime() {
|
|
|
|
let searchTerm = this.get('searchTerm');
|
|
|
|
const match = this.filterBlocks(REGEXP_POST_TIME_PREFIX);
|
|
|
|
const match = this.findSearchTerm(REGEXP_POST_TIME_PREFIX, searchTerm);
|
|
|
|
|
|
|
|
const timeDaysFilter = this.get('searchedTerms.time.days');
|
|
|
|
const timeDaysFilter = this.get('searchedTerms.time.days');
|
|
|
|
|
|
|
|
let searchTerm = this.get('searchTerm') || '';
|
|
|
|
|
|
|
|
|
|
|
|
if (timeDaysFilter) {
|
|
|
|
if (timeDaysFilter) {
|
|
|
|
const when = this.get('searchedTerms.time.when');
|
|
|
|
const when = this.get('searchedTerms.time.when');
|
|
|
|
if (match.length !== 0) {
|
|
|
|
if (match.length !== 0) {
|
|
|
|
searchTerm = searchTerm.replace(match, `${when}:${timeDaysFilter}`);
|
|
|
|
searchTerm = searchTerm.replace(match[0], `${when}:${timeDaysFilter}`);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
searchTerm += ` ${when}:${timeDaysFilter}`;
|
|
|
|
searchTerm += ` ${when}:${timeDaysFilter}`;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
this.set('searchTerm', searchTerm);
|
|
|
|
this.set('searchTerm', searchTerm.trim());
|
|
|
|
} else if (match.length !== 0) {
|
|
|
|
} else if (match.length !== 0) {
|
|
|
|
searchTerm = searchTerm.replace(match, '');
|
|
|
|
searchTerm = searchTerm.replace(match[0], '');
|
|
|
|
this.set('searchTerm', searchTerm);
|
|
|
|
this.set('searchTerm', searchTerm.trim());
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@observes('searchedTerms.posts_count')
|
|
|
|
|
|
|
|
updateSearchTermForPostsCount() {
|
|
|
|
|
|
|
|
const match = this.filterBlocks(REGEXP_POST_COUNT_PREFIX);
|
|
|
|
|
|
|
|
const postsCountFilter = this.get('searchedTerms.posts_count');
|
|
|
|
|
|
|
|
let searchTerm = this.get('searchTerm') || '';
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (postsCountFilter) {
|
|
|
|
|
|
|
|
if (match.length !== 0) {
|
|
|
|
|
|
|
|
searchTerm = searchTerm.replace(match[0], `posts_count:${postsCountFilter}`);
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
|
|
|
searchTerm += ` posts_count:${postsCountFilter}`;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.set('searchTerm', searchTerm.trim());
|
|
|
|
|
|
|
|
} else if (match.length !== 0) {
|
|
|
|
|
|
|
|
searchTerm = searchTerm.replace(match[0], '');
|
|
|
|
|
|
|
|
this.set('searchTerm', searchTerm.trim());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
|
|