diff --git a/src/common/SearchQueryParser.ts b/src/common/SearchQueryParser.ts index 3b45e1ef..225e32a8 100644 --- a/src/common/SearchQueryParser.ts +++ b/src/common/SearchQueryParser.ts @@ -161,6 +161,10 @@ export class SearchQueryParser { return timestamp; } + public static humanToRegexpStr(str: string) { + return str.replace(/%d/g, '\\d*'); + } + public parse(str: string, implicitAND = true): SearchQueryDTO { str = str .replace(/\s\s+/g, ' ') // remove double spaces @@ -168,9 +172,6 @@ export class SearchQueryParser { .trim(); - const humanToRegexpStr = (str: string) => { - return str.replace(/%d/g, '\\d*'); - }; const intFromRegexp = (str: string) => { return parseInt(new RegExp(/\d+/).exec(str)[0], 10); }; @@ -365,7 +366,7 @@ export class SearchQueryParser { if (kwStartsWith(str, this.keywords.sameDay) || - new RegExp('^' + humanToRegexpStr(this.keywords.lastNDays) + '!?:').test(str)) { + new RegExp('^' + SearchQueryParser.humanToRegexpStr(this.keywords.lastNDays) + '!?:').test(str)) { const freqStr = str.slice(str.indexOf(':') + 1); let freq: DatePatternFrequency = null; let ago; @@ -375,16 +376,16 @@ export class SearchQueryParser { freq = DatePatternFrequency.every_month; } else if (freqStr == this.keywords.every_year) { freq = DatePatternFrequency.every_year; - } else if (new RegExp('^' + humanToRegexpStr(this.keywords.days_ago) + '$').test(freqStr)) { + } else if (new RegExp('^' + SearchQueryParser.humanToRegexpStr(this.keywords.days_ago) + '$').test(freqStr)) { freq = DatePatternFrequency.days_ago; ago = intFromRegexp(freqStr); - } else if (new RegExp('^' + humanToRegexpStr(this.keywords.weeks_ago) + '$').test(freqStr)) { + } else if (new RegExp('^' + SearchQueryParser.humanToRegexpStr(this.keywords.weeks_ago) + '$').test(freqStr)) { freq = DatePatternFrequency.weeks_ago; ago = intFromRegexp(freqStr); - } else if (new RegExp('^' + humanToRegexpStr(this.keywords.months_ago) + '$').test(freqStr)) { + } else if (new RegExp('^' + SearchQueryParser.humanToRegexpStr(this.keywords.months_ago) + '$').test(freqStr)) { freq = DatePatternFrequency.months_ago; ago = intFromRegexp(freqStr); - } else if (new RegExp('^' + humanToRegexpStr(this.keywords.years_ago) + '$').test(freqStr)) { + } else if (new RegExp('^' + SearchQueryParser.humanToRegexpStr(this.keywords.years_ago) + '$').test(freqStr)) { freq = DatePatternFrequency.years_ago; ago = intFromRegexp(freqStr); } diff --git a/src/frontend/app/ui/gallery/search/autocomplete.service.ts b/src/frontend/app/ui/gallery/search/autocomplete.service.ts index c9b65f33..8715e8a2 100644 --- a/src/frontend/app/ui/gallery/search/autocomplete.service.ts +++ b/src/frontend/app/ui/gallery/search/autocomplete.service.ts @@ -28,7 +28,15 @@ export class AutoCompleteService { k !== this.searchQueryParserService.keywords.kmFrom && k !== this.searchQueryParserService.keywords.NSomeOf && k !== this.searchQueryParserService.keywords.minRating && - k !== this.searchQueryParserService.keywords.maxRating + k !== this.searchQueryParserService.keywords.maxRating && + k !== this.searchQueryParserService.keywords.every_week && + k !== this.searchQueryParserService.keywords.every_month && + k !== this.searchQueryParserService.keywords.every_year && + k !== this.searchQueryParserService.keywords.weeks_ago && + k !== this.searchQueryParserService.keywords.days_ago && + k !== this.searchQueryParserService.keywords.months_ago && + k !== this.searchQueryParserService.keywords.years_ago && + k !== this.searchQueryParserService.keywords.lastNDays ) .map((k) => k + ':'); @@ -40,6 +48,11 @@ export class AutoCompleteService { ); } + for (let i = 1; i < 5; i++) { + this.keywords.push( + this.searchQueryParserService.keywords.lastNDays.replace(/%d/g, i.toString()) + ':' + ); + } this.keywords.push( this.searchQueryParserService.keywords.to + @@ -303,6 +316,7 @@ export class AutoCompleteService { ret.push(generateMatch(mrKey)); } + if (text.current.toLowerCase().startsWith(mxrKey)) { for (let i = 1; i <= 5; ++i) { ret.push(generateMatch(mxrKey + i)); @@ -311,6 +325,23 @@ export class AutoCompleteService { ret.push(generateMatch(mxrKey)); } + // Date patterns + if (new RegExp('^' + + SearchQueryParser.humanToRegexpStr(this.searchQueryParserService.keywords.lastNDays) + '!?:$', 'i') + .test(text.current) || + new RegExp('^' + this.searchQueryParserService.keywords.sameDay + '!?:$', 'i') + .test(text.current)) { + ret.push(generateMatch(text.current + this.searchQueryParserService.keywords.every_week)); + ret.push(generateMatch(text.current + this.searchQueryParserService.keywords.every_month)); + ret.push(generateMatch(text.current + this.searchQueryParserService.keywords.every_year)); + + ret.push(generateMatch(text.current + this.searchQueryParserService.keywords.days_ago.replace(/%d/g, '2'))); + ret.push(generateMatch(text.current + this.searchQueryParserService.keywords.weeks_ago.replace(/%d/g, '2'))); + ret.push(generateMatch(text.current + this.searchQueryParserService.keywords.months_ago.replace(/%d/g, '2'))); + ret.push(generateMatch(text.current + this.searchQueryParserService.keywords.years_ago.replace(/%d/g, '2'))); + + } + return ret; } }