) => {
+ const newValue = event.target.value;
+ setValue(newValue);
+ };
+
+ const handleSearch = () => {
+ const trimmedValue = value.trim();
+ setValue(trimmedValue);
+ if (trimmedValue === "") {
+ window.alert("Please enter a name to search for");
+ } else {
+ navigate({
+ pathname: "/search",
+ search: `?${createSearchParams({name: trimmedValue})}`,
+ });
+ }
+ };
+
+ return (
+
+ {
+ if (event.key === "Enter") {
+ handleSearch();
+ }
+ }}
+ />
+
+
+ );
+};
+
+export default SearchBar;
diff --git a/src/components/members.tsx b/src/components/members.tsx
index efeed55..0f4024d 100644
--- a/src/components/members.tsx
+++ b/src/components/members.tsx
@@ -1,5 +1,6 @@
import {MemberType} from "queries/members";
import Member from "./member-button";
+import SearchBar from "./layout/searchbar";
type Props = {
members: MemberType[];
@@ -7,11 +8,14 @@ type Props = {
};
const Members = ({members, selectMember}: Props) => (
-
+ <>
+
+
+ >
);
export default Members;
diff --git a/src/index.css b/src/index.css
index 00c31a3..2a2d5f6 100644
--- a/src/index.css
+++ b/src/index.css
@@ -95,6 +95,34 @@ button {
background-color: var(--sidebar-primary);
}
+.searchbar {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ width: 100%;
+ margin: 16px 0;
+ box-sizing: border-box;
+ height: 10%;
+}
+
+.searchbar input[type="text"] {
+ flex: 1 1 auto;
+ min-width: 0;
+ height: 75%;
+ padding: 0 14px;
+ border: 1px solid #ccc;
+ background: #fff;
+ color: #333;
+}
+
+.searchbar .searchbar__button {
+ flex: 0 0 auto;
+ height: 75%;
+ width: 10%;
+ padding: 0 20px;
+ white-space: nowrap;
+}
+
.button {
color: var(--secondary);
background-color: var(--primary);
@@ -127,7 +155,7 @@ button {
}
.tilesGrid {
- height: 100%;
+ height: 85%;
display: grid;
grid-template-columns: repeat(var(--gridCollumns), 1fr);
grid-template-rows: auto;
diff --git a/src/routes/index.tsx b/src/routes/index.tsx
index 7f4d023..95aeee0 100644
--- a/src/routes/index.tsx
+++ b/src/routes/index.tsx
@@ -1,6 +1,7 @@
import {useNavigate} from "react-router";
import {useGroupedSurnames} from "../queries/members";
import {MemberType} from "../queries/members";
+import SearchBar from "components/layout/searchbar";
type Range = {
idx: number;
@@ -14,16 +15,23 @@ type SurnameRangesProps = {
};
export const SurnameRanges = ({ranges, selectRange}: SurnameRangesProps) => (
-
- {ranges.map((range) => (
-
- ))}
-
+ <>
+
+
+ {ranges.map((range) => (
+
+ ))}
+
+ >
);
const SurnameRangesScreen = () => {
diff --git a/src/routes/members/search.tsx b/src/routes/members/search.tsx
new file mode 100644
index 0000000..8259f65
--- /dev/null
+++ b/src/routes/members/search.tsx
@@ -0,0 +1,23 @@
+import Members from "../../components/members";
+import {useSearchParams} from "react-router-dom";
+import {useSelectMember} from "../../components/orders-context";
+import {useMembers} from "queries/members";
+
+const useFoundMembers = () => {
+ const [searchParams] = useSearchParams();
+ const name = searchParams.get("name")?.trim().toLowerCase() || "";
+ const {members} = useMembers();
+
+ if (!name) return [];
+ return members
+ .filter((m) => m.fullname.toLowerCase().includes(name))
+ .sort((a, b) => a.fullname.localeCompare(b.fullname));
+};
+
+const SearchMembers = () => {
+ const foundMembers = useFoundMembers();
+ const selectMember = useSelectMember();
+ return ;
+};
+
+export default SearchMembers;