diff --git a/web_src/css/modules/search.css b/web_src/css/modules/search.css index 532c979ece..7cf91d032f 100644 --- a/web_src/css/modules/search.css +++ b/web_src/css/modules/search.css @@ -1,5 +1,3 @@ -/* Styles for the first-party search-box autocomplete (web_src/js/modules/fomantic/search.ts) */ - .ui.search { position: relative; } diff --git a/web_src/js/features/comp/SearchRepoBox.ts b/web_src/js/features/comp/SearchRepoBox.ts index 629f7cebbd..46e7456468 100644 --- a/web_src/js/features/comp/SearchRepoBox.ts +++ b/web_src/js/features/comp/SearchRepoBox.ts @@ -2,6 +2,8 @@ import {chooseFromApi} from '../../modules/search.ts'; const {appSubUrl} = window.config; +type RepoSearchResponse = {data: Array<{repository: {full_name: string}}>}; + export async function initCompSearchRepoBox(el: HTMLElement) { const uid = el.getAttribute('data-uid'); const exclusive = el.getAttribute('data-exclusive'); @@ -10,7 +12,7 @@ export async function initCompSearchRepoBox(el: HTMLElement) { const input = el.querySelector('input.prompt')!; while (el.isConnected) { - const pick = await chooseFromApi(el, url, (response: any) => response.data.map((item: any) => ({ + const pick = await chooseFromApi(el, url, (response) => response.data.map((item) => ({ title: item.repository.full_name.split('/')[1], description: item.repository.full_name, }))); diff --git a/web_src/js/features/comp/SearchUserBox.ts b/web_src/js/features/comp/SearchUserBox.ts index c812bc6b0e..b4850db46f 100644 --- a/web_src/js/features/comp/SearchUserBox.ts +++ b/web_src/js/features/comp/SearchUserBox.ts @@ -3,6 +3,8 @@ import {chooseFromApi, type SearchResult} from '../../modules/search.ts'; const {appSubUrl} = window.config; const looksLikeEmailAddressCheck = /^\S+@\S+$/; +type UserSearchResponse = {data: Array<{login: string; avatar_url: string; full_name: string}>}; + export async function initCompSearchUserBox() { const box = document.querySelector('#search-user-box'); if (!box) return; @@ -14,7 +16,7 @@ export async function initCompSearchUserBox() { const input = box.querySelector('input.prompt')!; while (box.isConnected) { - const pick = await chooseFromApi(box, url, (response: any, query: string) => { + const pick = await chooseFromApi(box, url, (response, query) => { const items: SearchResult[] = []; const queryUpper = query.toUpperCase(); for (const item of response.data) { diff --git a/web_src/js/features/repo-settings.ts b/web_src/js/features/repo-settings.ts index 6fabb2b9c1..a0815212fe 100644 --- a/web_src/js/features/repo-settings.ts +++ b/web_src/js/features/repo-settings.ts @@ -46,6 +46,8 @@ function initRepoSettingsCollaboration() { } } +type TeamSearchResponse = {data: Array<{name: string; permission: string}>}; + async function initRepoSettingsSearchTeamBox() { const box = document.querySelector('#search-team-box'); if (!box) return; @@ -53,7 +55,7 @@ async function initRepoSettingsSearchTeamBox() { const url = `${appSubUrl}/org/${box.getAttribute('data-org-name')}/teams/-/search?q={query}`; const input = box.querySelector('input.prompt')!; while (box.isConnected) { - const pick = await chooseFromApi(box, url, (response: any) => response.data.map((item: any) => ({ + const pick = await chooseFromApi(box, url, (response) => response.data.map((item) => ({ title: item.name, description: `${item.permission} access`, // TODO: translate this string }))); diff --git a/web_src/js/modules/search.ts b/web_src/js/modules/search.ts index 4e87da02c1..5f580de54c 100644 --- a/web_src/js/modules/search.ts +++ b/web_src/js/modules/search.ts @@ -17,7 +17,7 @@ function buildResultHTML(result: SearchResult): string { // Awaits one user selection from an autocomplete attached to `container`. Resolves with // the chosen item; the caller writes it to whatever input/state it owns. Wrap in a loop // to keep the search box live across selections. -export function chooseFromApi(container: HTMLElement, url: string, parse: (raw: any, query: string) => SearchResult[], {minCharacters = 2}: {minCharacters?: number} = {}): Promise { +export function chooseFromApi(container: HTMLElement, url: string, parse: (raw: T, query: string) => SearchResult[], {minCharacters = 2}: {minCharacters?: number} = {}): Promise { return new Promise((resolve) => { const input = container.querySelector('input.prompt') ?? container.querySelector('input')!;