update header fields on typing

This commit is contained in:
2026-06-02 22:46:24 +02:00
parent 5ed83a20d8
commit 4cd7b0199e
6 changed files with 123 additions and 28 deletions
+27 -5
View File
@@ -1,11 +1,13 @@
import type { ChangeEvent } from "react";
import FormField from "#/components/FormField.tsx"; import FormField from "#/components/FormField.tsx";
import type { IHeader } from "#/interfaces.ts"; import type { IHeader } from "#/interfaces.ts";
interface IProps { interface IProps {
headers: IHeader; headers: IHeader;
updateHeaders: (e: ChangeEvent<HTMLInputElement>, fieldName: string) => void;
} }
const CustomHeaders = ({ headers }: IProps) => { const CustomHeaders = ({ headers, updateHeaders }: IProps) => {
return ( return (
<div className="my-4 w-full"> <div className="my-4 w-full">
<details className="bg-(--neutral-content)/20 p-4 rounded-lg"> <details className="bg-(--neutral-content)/20 p-4 rounded-lg">
@@ -18,10 +20,30 @@ const CustomHeaders = ({ headers }: IProps) => {
</summary> </summary>
<div> <div>
<form className="grid place-items-center gap-4 sm:grid-cols-2 mt-2"> <form className="grid place-items-center gap-4 sm:grid-cols-2 mt-2">
<FormField fieldName="title" type="text" headers={headers} /> <FormField
<FormField fieldName="subtitle" type="text" headers={headers} /> fieldName="title"
<FormField fieldName="date" type="text" headers={headers} /> type="text"
<FormField fieldName="author" type="text" headers={headers} /> headers={headers}
updateHeaders={updateHeaders}
/>
<FormField
fieldName="subtitle"
type="text"
headers={headers}
updateHeaders={updateHeaders}
/>
<FormField
fieldName="date"
type="text"
headers={headers}
updateHeaders={updateHeaders}
/>
<FormField
fieldName="author"
type="text"
headers={headers}
updateHeaders={updateHeaders}
/>
</form> </form>
</div> </div>
</details> </details>
+3 -4
View File
@@ -1,15 +1,14 @@
import { useChessGame } from "#/hooks/useChessGame.ts"; import type { ChangeEvent } from "react";
import type { IHeader } from "#/interfaces.ts"; import type { IHeader } from "#/interfaces.ts";
export interface IFormField { export interface IFormField {
fieldName: string; fieldName: string;
type: string; type: string;
headers: IHeader; headers: IHeader;
updateHeaders: (e: ChangeEvent<HTMLInputElement>, fieldName: string) => void;
} }
const FormField = ({ fieldName, type, headers }: IFormField) => { const FormField = ({ fieldName, type, headers, updateHeaders }: IFormField) => {
const { updateHeaders } = useChessGame();
return ( return (
<div className="flex flex-col gap-2"> <div className="flex flex-col gap-2">
<label htmlFor={fieldName} className="text-sm capitalize"> <label htmlFor={fieldName} className="text-sm capitalize">
+82 -17
View File
@@ -1,35 +1,100 @@
import type { ChangeEvent } from "react";
import FormField from "#/components/FormField.tsx"; import FormField from "#/components/FormField.tsx";
import type { IHeader } from "#/interfaces.ts"; import type { IHeader } from "#/interfaces.ts";
interface IProps { interface IProps {
headers: IHeader; headers: IHeader;
updateHeaders: (e: ChangeEvent<HTMLInputElement>, fieldName: string) => void;
} }
const HeaderFields = ({ headers }: IProps) => { const HeaderFields = ({ headers, updateHeaders }: IProps) => {
console.log(headers);
return ( return (
<div className="my-4 w-full"> <div className="my-4 w-full">
<details className="bg-(--neutral-content)/20 p-4 rounded-lg"> <details className="bg-(--neutral-content)/15 p-4 rounded-lg">
<summary> <summary>
Headers Headers
<p className="text-sm font-normal">Edit the game PGN headers</p> <p className="text-sm font-normal">Edit the game PGN headers</p>
</summary> </summary>
<div> <div>
<form className="grid place-items-center gap-4 sm:grid-cols-2 mt-2"> <form className="grid place-items-center gap-4 sm:grid-cols-2 mt-2">
<FormField fieldName="event" type="text" headers={headers} /> <FormField
<FormField fieldName="site" type="text" headers={headers} /> fieldName="event"
<FormField fieldName="date" type="text" headers={headers} /> type="text"
<FormField fieldName="round" type="text" headers={headers} /> headers={headers}
<FormField fieldName="white" type="text" headers={headers} /> updateHeaders={updateHeaders}
<FormField fieldName="black" type="text" headers={headers} /> />
<FormField fieldName="result" type="text" headers={headers} /> <FormField
<FormField fieldName="eco" type="text" headers={headers} /> fieldName="site"
<FormField fieldName="whiteElo" type="text" headers={headers} /> type="text"
<FormField fieldName="blackElo" type="text" headers={headers} /> headers={headers}
<FormField fieldName="plyCount" type="text" headers={headers} /> updateHeaders={updateHeaders}
<FormField fieldName="eventDate" type="text" headers={headers} /> />
<FormField fieldName="source" type="text" headers={headers} /> <FormField
fieldName="date"
type="text"
headers={headers}
updateHeaders={updateHeaders}
/>
<FormField
fieldName="round"
type="text"
headers={headers}
updateHeaders={updateHeaders}
/>
<FormField
fieldName="white"
type="text"
headers={headers}
updateHeaders={updateHeaders}
/>
<FormField
fieldName="black"
type="text"
headers={headers}
updateHeaders={updateHeaders}
/>
<FormField
fieldName="result"
type="text"
headers={headers}
updateHeaders={updateHeaders}
/>
<FormField
fieldName="eco"
type="text"
headers={headers}
updateHeaders={updateHeaders}
/>
<FormField
fieldName="whiteElo"
type="text"
headers={headers}
updateHeaders={updateHeaders}
/>
<FormField
fieldName="blackElo"
type="text"
headers={headers}
updateHeaders={updateHeaders}
/>
<FormField
fieldName="plyCount"
type="text"
headers={headers}
updateHeaders={updateHeaders}
/>
<FormField
fieldName="eventDate"
type="text"
headers={headers}
updateHeaders={updateHeaders}
/>
<FormField
fieldName="source"
type="text"
headers={headers}
updateHeaders={updateHeaders}
/>
</form> </form>
</div> </div>
</details> </details>
+1
View File
@@ -118,6 +118,7 @@ export const useChessGame = () => {
...getHeaders(pgnString), ...getHeaders(pgnString),
title: "", title: "",
subtitle: "", subtitle: "",
author: "",
}; };
gameDispatch({ gameDispatch({
type: "SET_GAME", type: "SET_GAME",
+9 -2
View File
@@ -18,6 +18,7 @@ const Chessboard = () => {
handleToggleClock, handleToggleClock,
handleToggleDiagram, handleToggleDiagram,
handlePlyChange, handlePlyChange,
updateHeaders,
} = useChessGame(); } = useChessGame();
return ( return (
@@ -101,8 +102,14 @@ const Chessboard = () => {
</button> </button>
</div> </div>
<HeaderFields headers={gameState.headers} /> <HeaderFields
<CustomHeaders headers={gameState.headers} /> headers={gameState.headers}
updateHeaders={updateHeaders}
/>
<CustomHeaders
headers={gameState.headers}
updateHeaders={updateHeaders}
/>
</div> </div>
</div> </div>
</main> </main>
+1
View File
@@ -9,6 +9,7 @@
&:focus { &:focus {
outline: none; outline: none;
border-color: var(--accent); border-color: var(--accent);
background-color: var(--header-bg);
} }
} }