Extracted formatting function and added aliases support

This commit is contained in:
KoloMl 2025-02-10 05:45:34 +04:00
parent d6e360a3a5
commit 4f772c5c69
3 changed files with 55 additions and 3 deletions

View file

@ -7,7 +7,13 @@ import { getTermContexts } from './match_query';
import store from './utils/store'; import store from './utils/store';
import { TermContext } from './query/lex'; import { TermContext } from './query/lex';
import { $$ } from './utils/dom'; import { $$ } from './utils/dom';
import { fetchLocalAutocomplete, fetchSuggestions, SuggestionsPopup, TermSuggestion } from './utils/suggestions'; import {
formatLocalAutocompleteResult,
fetchLocalAutocomplete,
fetchSuggestions,
SuggestionsPopup,
TermSuggestion,
} from './utils/suggestions';
let inputField: HTMLInputElement | null = null, let inputField: HTMLInputElement | null = null,
originalTerm: string | undefined, originalTerm: string | undefined,
@ -173,7 +179,7 @@ function listenAutocomplete() {
const suggestions = localAc const suggestions = localAc
.matchPrefix(trimPrefixes(originalTerm), suggestionsCount) .matchPrefix(trimPrefixes(originalTerm), suggestionsCount)
.map(({ name, imageCount }) => ({ label: `${name} (${imageCount})`, value: name })); .map(formatLocalAutocompleteResult);
if (suggestions.length) { if (suggestions.length) {
popup.renderSuggestions(suggestions).showForField(targetedInput); popup.renderSuggestions(suggestions).showForField(targetedInput);

View file

@ -2,6 +2,7 @@ import { fetchMock } from '../../../test/fetch-mock.ts';
import { import {
fetchLocalAutocomplete, fetchLocalAutocomplete,
fetchSuggestions, fetchSuggestions,
formatLocalAutocompleteResult,
purgeSuggestionsCache, purgeSuggestionsCache,
SuggestionsPopup, SuggestionsPopup,
TermSuggestion, TermSuggestion,
@ -11,6 +12,7 @@ import path from 'path';
import { LocalAutocompleter } from '../local-autocompleter.ts'; import { LocalAutocompleter } from '../local-autocompleter.ts';
import { afterEach } from 'vitest'; import { afterEach } from 'vitest';
import { fireEvent } from '@testing-library/dom'; import { fireEvent } from '@testing-library/dom';
import { getRandomIntBetween } from '../../../test/randomness.ts';
const mockedSuggestionsEndpoint = '/endpoint?term='; const mockedSuggestionsEndpoint = '/endpoint?term=';
const mockedSuggestionsResponse = [ const mockedSuggestionsResponse = [
@ -331,4 +333,35 @@ describe('Suggestions', () => {
expect(() => fetchLocalAutocomplete()).rejects.toThrowError('Received error from server'); expect(() => fetchLocalAutocomplete()).rejects.toThrowError('Received error from server');
}); });
}); });
describe('formatLocalAutocompleteResult', () => {
it('should format suggested tags as tag name and the count', () => {
const tagName = 'safe';
const tagCount = getRandomIntBetween(5, 10);
const resultObject = formatLocalAutocompleteResult({
name: tagName,
aliasName: tagName,
imageCount: tagCount,
});
expect(resultObject.label).toBe(`${tagName} (${tagCount})`);
expect(resultObject.value).toBe(tagName);
});
it('should display original alias name for aliased tags', () => {
const tagName = 'safe';
const tagAlias = 'rating:safe';
const tagCount = getRandomIntBetween(5, 10);
const resultObject = formatLocalAutocompleteResult({
name: tagName,
aliasName: tagAlias,
imageCount: tagCount,
});
expect(resultObject.label).toBe(`${tagAlias}${tagName} (${tagCount})`);
expect(resultObject.value).toBe(tagName);
});
});
}); });

View file

@ -1,7 +1,7 @@
import { makeEl } from './dom.ts'; import { makeEl } from './dom.ts';
import { mouseMoveThenOver } from './events.ts'; import { mouseMoveThenOver } from './events.ts';
import { handleError } from './requests.ts'; import { handleError } from './requests.ts';
import { LocalAutocompleter } from './local-autocompleter.ts'; import { LocalAutocompleter, Result } from './local-autocompleter.ts';
export interface TermSuggestion { export interface TermSuggestion {
label: string; label: string;
@ -175,3 +175,16 @@ export async function fetchLocalAutocomplete(): Promise<LocalAutocompleter> {
.then(resp => resp.arrayBuffer()) .then(resp => resp.arrayBuffer())
.then(buf => new LocalAutocompleter(buf)); .then(buf => new LocalAutocompleter(buf));
} }
export function formatLocalAutocompleteResult(result: Result): TermSuggestion {
let tagName = result.name;
if (tagName !== result.aliasName) {
tagName = `${result.aliasName}${tagName}`;
}
return {
value: result.name,
label: `${tagName} (${result.imageCount})`,
};
}