- Removed unnecessary React imports. - Adjusted package.json scripts for Electron integration. - Updated components to replace Next.js-specific imports with Electron-compatible alternatives. - Minor tsconfig.json changes for better compatibility.
72 lines
3.1 KiB
TypeScript
72 lines
3.1 KiB
TypeScript
import {ChangeEvent, KeyboardEvent, useRef, useState} from "react";
|
|
import AddActionButton from "@/components/form/AddActionButton";
|
|
|
|
interface InlineAddInputProps {
|
|
value: string;
|
|
setValue: (value: string) => void;
|
|
numericalValue?: number;
|
|
setNumericalValue?: (value: number) => void;
|
|
placeholder: string;
|
|
onAdd: () => Promise<void>;
|
|
showNumericalInput?: boolean;
|
|
}
|
|
|
|
export default function InlineAddInput(
|
|
{
|
|
value,
|
|
setValue,
|
|
numericalValue,
|
|
setNumericalValue,
|
|
placeholder,
|
|
onAdd,
|
|
showNumericalInput = false
|
|
}: InlineAddInputProps) {
|
|
const [isAdding, setIsAdding] = useState<boolean>(false);
|
|
const listItemRef = useRef<HTMLLIElement>(null);
|
|
|
|
async function handleAdd(): Promise<void> {
|
|
await onAdd();
|
|
setIsAdding(false);
|
|
}
|
|
|
|
return (
|
|
<li
|
|
ref={listItemRef}
|
|
onBlur={(e: React.FocusEvent<HTMLLIElement, Element>): void => {
|
|
if (!listItemRef.current?.contains(e.relatedTarget)) {
|
|
setIsAdding(false);
|
|
}
|
|
}}
|
|
className="relative flex items-center gap-1 h-[44px] px-3 bg-secondary/30 rounded-xl border-2 border-dashed border-secondary/50 hover:border-primary/60 hover:bg-secondary/50 cursor-pointer transition-colors duration-200"
|
|
>
|
|
{showNumericalInput && numericalValue !== undefined && setNumericalValue && (
|
|
<input
|
|
className={`bg-secondary/50 text-primary text-sm px-1.5 py-0.5 rounded border border-secondary/50 transition-all duration-200 !outline-none !ring-0 !shadow-none focus-visible:!outline-none focus-visible:!ring-0 focus-visible:!shadow-none ${isAdding ? 'w-10 opacity-100' : 'w-0 opacity-0 px-0 border-0'}`}
|
|
type="number"
|
|
value={numericalValue}
|
|
onChange={(e: ChangeEvent<HTMLInputElement>) => setNumericalValue(parseInt(e.target.value))}
|
|
tabIndex={isAdding ? 0 : -1}
|
|
/>
|
|
)}
|
|
<input
|
|
onFocus={(): void => setIsAdding(true)}
|
|
onKeyUp={async (e: KeyboardEvent<HTMLInputElement>) => {
|
|
if (e.key === 'Enter') {
|
|
await handleAdd();
|
|
}
|
|
}}
|
|
className="flex-1 min-w-0 bg-transparent text-text-primary text-sm px-1 py-0.5 cursor-pointer focus:cursor-text placeholder:text-muted/60 transition-all duration-200 !outline-none !ring-0 !shadow-none focus-visible:!outline-none focus-visible:!ring-0 focus-visible:!shadow-none"
|
|
type="text"
|
|
onChange={(e: ChangeEvent<HTMLInputElement>) => setValue(e.target.value)}
|
|
value={value}
|
|
placeholder={placeholder}
|
|
/>
|
|
{isAdding && (
|
|
<div className="absolute right-1 opacity-100">
|
|
<AddActionButton callBackAction={handleAdd}/>
|
|
</div>
|
|
)}
|
|
</li>
|
|
);
|
|
}
|