Skip to content
This repository was archived by the owner on Feb 9, 2026. It is now read-only.

Commit 8c55014

Browse files
committed
frontend:MemberListコンポーネントの編集
1 parent 0e6760b commit 8c55014

File tree

1 file changed

+38
-16
lines changed

1 file changed

+38
-16
lines changed

frontend/src/components/MemberList.tsx

Lines changed: 38 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
11
import { PlusIcon } from "lucide-react";
2-
import { useState } from "react";
2+
import { useState, useRef, useEffect } from "react";
33
import { Button } from "./ui/button";
44
import { Input } from "./ui/input";
55

66
export default function MemberList() {
77
// メンバー名の配列を状態として管理
88
const [members, setMembers] = useState<string[]>([""]);
9+
// 各inputへの参照を保持
10+
const inputRefs = useRef<(HTMLInputElement | null)[]>([]);
911

1012
// メンバー追加関数
1113
const handleAddMember = () => {
12-
setMembers([...members, ""]);
14+
setMembers((prev) => [...prev, ""]);
1315
};
1416

1517
// 入力内容を更新する関数
@@ -21,37 +23,57 @@ export default function MemberList() {
2123

2224
// メンバー削除関数
2325
const handleDeleteMember = (index: number) => {
26+
// アラートの表示
27+
alert('本当に削除しますか')
28+
2429
// フィルターで指定index以外を残す
25-
const updated = members.filter((_, i) => i !== index);
26-
setMembers(updated);
30+
setMembers((prev) => prev.filter((_, i) => i !== index));
31+
};
32+
33+
const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>, index: number) => {
34+
if (e.key === "Enter") {
35+
e.preventDefault();
36+
37+
// 最後の要素なら新しい入力欄を追加
38+
if (index === members.length - 1) {
39+
handleAddMember();
40+
} else {
41+
// 次の入力欄にフォーカス
42+
inputRefs.current[index + 1]?.focus();
43+
}
44+
}
2745
};
2846

47+
// メンバー追加時に自動で新しい欄にフォーカス
48+
useEffect(() => {
49+
if (inputRefs.current[members.length - 1]) {
50+
inputRefs.current[members.length - 1]?.focus();
51+
}
52+
}, [members.length]);
53+
2954
return (
30-
<div style={{ padding: "10px" }}>
31-
<h2>メンバー一覧</h2>
55+
<div className="p-4">
56+
<h2 className="mb-2 text-xl font-semibold">メンバー一覧</h2>
3257

3358
{members.map((member, index) => (
3459
<div
35-
key={index}
36-
style={{
37-
marginBottom: "8px",
38-
display: "flex",
39-
alignItems: "center",
40-
gap: "8px",
41-
}}
42-
>
60+
key={index} className="mb-2 flex items-center gap-2">
4361
<Input
62+
//各inputを登録
63+
ref={(el) => {inputRefs.current[index] = el}}
4464
type="text"
4565
value={member}
4666
placeholder={`メンバー${index + 1}`}
4767
onChange={(e) => handleChange(index, e.target.value)}
68+
onKeyDown={(e) => handleKeyDown(e, index)}
69+
className="border rounded-md px-2 py-1 focus:outline-none focus:ring-2 focus:ring-blue-400"
4870
/>
4971

5072
{/* 削除ボタン */}
5173
<Button
5274
onClick={() => handleDeleteMember(index)}
5375
variant="destructive"
54-
className="cursor-pointer"
76+
className="cursor-pointer hover:bg-red-700"
5577
>
5678
削除
5779
</Button>
@@ -62,7 +84,7 @@ export default function MemberList() {
6284
<Button
6385
onClick={handleAddMember}
6486
variant="outline"
65-
className="cursor-pointer"
87+
className="cursor-pointer mt-2"
6688
>
6789
<PlusIcon />
6890
メンバーを追加

0 commit comments

Comments
 (0)