diff --git a/app/my-notebooks/[notebookId]/CardRow.tsx b/app/my-notebooks/[notebookId]/CardRow.tsx index a816229..5f10c74 100644 --- a/app/my-notebooks/[notebookId]/CardRow.tsx +++ b/app/my-notebooks/[notebookId]/CardRow.tsx @@ -26,6 +26,20 @@ function SaveButton() { ); } +// Excelの結合セルのように、ある列で連続する組(行)の値が同じであればまとめてrowSpanで +// 1つのセルにする。先頭行以外はnull(描画しない)を返し、代わりに直前のセルのrowSpanを伸ばす。 +// 空文字同士は結合しない(未入力のセルが1つの大きな空欄に見えて紛らわしいのを避けるため) +function computeRowSpans(values: string[]): number[] { + const spans = values.map(() => 1); + for (let i = values.length - 1; i > 0; i -= 1) { + if (values[i] !== "" && values[i] === values[i - 1]) { + spans[i - 1] += spans[i]; + spans[i] = 0; + } + } + return spans; +} + export default function CardRow({ notebookId, columns, @@ -54,7 +68,8 @@ export default function CardRow({ } } - const senseColumns = columns.slice(1); + // 見出し語を除いた列。表示順そのまま + const bodyColumns = columns.slice(1); // toggleStarの結果(サーバーの往復)を待たず、クリックした瞬間に★・回数・色を切り替えるための // 楽観的UI。これが無いと、往復の間だけ古い状態(トグル前の☆)が表示され続けてしまい、 @@ -77,44 +92,41 @@ export default function CardRow({ const starColor = starColorFor(optimisticStar.starCount, starColors); if (!editing) { - // 意味が0件でも見出し語だけの行を1行表示する(表側の "senses" が空配列にならないようフォールバック) - const senses = card.data.senses.length > 0 ? card.data.senses : [{}]; + // 見出し語1件につき、rows(組)の件数ぶん