Files
CT/src/View/Modals/searchModal.tsx
T

81 lines
2.9 KiB
TypeScript
Raw Normal View History

2026-04-18 11:55:01 +00:00
import { v4 } from "uuid";
2024-07-25 15:31:27 +02:00
import * as React from "bloatless-react";
2026-04-18 11:55:01 +00:00
import { ViewController } from "../viewController";
2024-07-27 03:41:47 +02:00
import { StringToOption } from "../Components/option";
2026-04-18 11:55:01 +00:00
import SearchViewModel from "../../ViewModel/Utility/searchViewModel";
import CoreViewModel from "../../ViewModel/Global/coreViewModel";
2024-07-25 15:31:27 +02:00
export function SearchModal<T>(
coreViewModel: CoreViewModel,
2026-04-01 08:29:39 +00:00
searchViewModel: SearchViewModel<T>,
headline: string,
converter: React.StateItemConverter<T>,
isOpen: React.State<boolean>,
2024-07-25 15:31:27 +02:00
) {
2026-04-01 08:29:39 +00:00
function close() {
isOpen.value = false;
}
2024-07-25 15:31:27 +02:00
2026-04-01 08:29:39 +00:00
const suggestionId = v4();
2024-07-27 03:41:47 +02:00
2026-04-15 12:47:10 +00:00
isOpen.subscribe((isOpen) => {
if (!isOpen) return;
ViewController.setFocusWithDelay();
});
2026-04-13 10:26:03 +00:00
2026-04-01 08:29:39 +00:00
return (
<div class="modal" toggle:open={isOpen} extended>
<div>
2026-04-01 08:29:39 +00:00
<main>
<h2>{headline}</h2>
<div class="flex-row width-input">
<input
2026-04-13 11:23:17 +00:00
id="focused"
placeholder={
coreViewModel.translations.general.searchLabel
}
2026-04-01 08:29:39 +00:00
bind:value={searchViewModel.searchInput}
on:enter={searchViewModel.applySearch}
list={suggestionId}
></input>
<datalist
hidden
id={suggestionId}
children:append={[
searchViewModel.suggestions,
StringToOption,
]}
></datalist>
<button
class="primary"
aria-label={
coreViewModel.translations.general
.searchButtonAudioLabel
2026-04-01 08:29:39 +00:00
}
on:click={searchViewModel.applySearch}
toggle:disabled={searchViewModel.cannotApplySearch}
>
<span class="icon">search</span>
</button>
</div>
2024-07-25 15:31:27 +02:00
2026-04-01 08:29:39 +00:00
<hr></hr>
2024-07-25 15:31:27 +02:00
2026-04-01 08:29:39 +00:00
<div
class="grid gap"
style="grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr))"
children:append={[
searchViewModel.matchingObjects,
converter,
]}
></div>
</main>
<button on:click={close}>
{coreViewModel.translations.general.closeButton}
2026-04-01 08:29:39 +00:00
<span class="icon">close</span>
</button>
</div>
</div>
);
2024-07-25 15:31:27 +02:00
}