import { useState } from "react";
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@godxjp/ui/data-display";
import { SearchInput } from "@godxjp/ui/data-entry";
import { Text } from "@godxjp/ui/general";
import { Flex, PageContainer } from "@godxjp/ui/layout";
/**
* SearchInput — debounced search box with a built-in clear button.
* onSearch runs after a changed query settles, never on mount.
* Always listen to onSearch (NOT onChange). Uncontrolled for local filters,
* controlled when search state lives in a URL param. Never a raw .
* Composed only from real @godxjp/ui components.
*/
export default function Demo() {
const [journalQuery, setJournalQuery] = useState("");
const [partnerQuery, setPartnerQuery] = useState("");
const journals = [
{ id: "JE-0001", desc: "売上計上 · 株式会社山田商事" },
{ id: "JE-0002", desc: "仕入計上 · 有限会社田中工業" },
{ id: "JE-0003", desc: "経費精算 · 交通費" },
{ id: "JE-0004", desc: "売上計上 · ABC株式会社" },
{ id: "JE-0005", desc: "給与支払 · 2024年3月分" },
];
const filtered = journals.filter(
(j) =>
j.id.toLowerCase().includes(journalQuery.toLowerCase()) ||
j.desc.toLowerCase().includes(journalQuery.toLowerCase()),
);
return (
仕訳一覧フィルター(制御モード)
value + onValueChange で即時制御(入力に追従)。onSearch は 250 ms
デバウンス後に発火。
{}}
/>
{filtered.length === 0 ? (
該当なし
) : (
filtered.map((j) => (
{j.id}
{" "}
{j.desc}
))
)}
取引先検索(非制御モード)
defaultValue のみ渡して非制御。ローカルフィルターに適す。
{partnerQuery && (
検索中:{" "}
{partnerQuery}
)}
カスタム ariaLabel
隣接するラベルがない場合は ariaLabel で補完する。
{}}
/>
);
}