Repository navigation
feat: 編み図の一覧に縮小画像と更新日時を出す - #124
Merged
Merged
Conversation
The chart panel now shows a small color mosaic of each board, its size, and when it was last saved. Thumbnails are built from the saved cells when the list is shown and are not stored, so the IndexedDB records and the .knit format stay unchanged. The rename, duplicate and delete buttons move to their own row so they keep a usable width on phones. Closes #92 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
K0mork
commented
Oct 6, 2026
K0mork
left a comment
Owner
Author
There was a problem hiding this comment.
レビュー(8d95cfe)
CI
CI and deploy Pages はすべて成功しました(ci-gate 成功。deploy・smoke はPRなのでスキップ)。
web: Vitest 30ファイル・184件成功、Playwright 106件成功・2件スキップ(再試行なし)ios_web、release_archive、ios (iPhone 17)、ios (iPad (A16))、app_update (iPhone 17)、app_update (iPad (A16)): 成功- CodeQL、
app_store_docs、changes: 成功
iOSのUIテストは、一覧の項目を label BEGINSWITH "M2切替A" などの前方一致で探し、作成ボタンを app.buttons["新しい編み図"] の完全一致で探します。読み上げ文は名前で始まり、作成ボタンの名前とも完全一致しないので、どちらにも影響はありません(Simulatorのジョブも成功)。
確かめたこと(問題なし)
- 縮小画像の作り方は
Boardの読み込みと同じです。旧形式のセルはboardFromDocumentと同じ条件で黒の記号として読み、未知の記号と盤面からはみ出す記号は描きません。複数のセルにまたがる記号は、占めるセルをすべて数えます。 - 面積平均では、端の画素の面積と空きのセル(白)も数えます。壊れたデータで記号が重なっても、面積を超えて数えません。
IntersectionObserverが無い環境では、すぐに描きます。- 日時は端末の時刻で書きます。「昨日」は前日の正午を基準にして求めるので、夏時間の切り替え日でも誤りません。年をまたぐ日もテストで確かめています。
datetime属性はISO 8601です。 - IndexedDBの記録、DBの版、
.knitの形式は変えていません。互換テスト(thumbnailCompatibility.test.ts)もあります。 - packedのセル配列のまま処理しており、セルをDOMにしていません。
- ボタンの高さは
--compact-tap-size(Web 34px/iOS 44px)を保っています。E2Eで、長い名前でもボタンが幅64px以上を保ち、重ならないことを確かめています。 - 差分、PR本文、コミットメッセージ、開発ログに機密情報はありません。
Closes #92とラベルenhancementがあります。開発ログは書式どおりで、CIの結果とも合っています。
指摘
- 中:
ThumbnailCacheが古いセル配列を持ち続ける。 キャッシュの項目は最初のcells(ArrayBuffer)を保持します。getで更新日時が一致したときは、その古い参照を差し替えずに返します。名前変更・複製・削除・新規作成・復元のあとのrefreshDocuments()はlistDocuments()を読み直すので、すべての編み図が新しいArrayBufferになります。その結果、縮小画像を作った編み図ごとに、古いセル配列が1つずつ余分にメモリに残ります。1000×1000では1件4MBで、キャッシュはモジュールに置かれているため、一覧を閉じても解放されません。比較をid・rows・cols・updatedAtだけにして、項目にcellsを持たせないのがよいと思います。少なくとも、一致したときに参照を差し替えてください。 - 低: テストのコメントと実測値が合っていない。
thumbnail.test.tsのコメントは「手元では数ms」ですが、PR本文と開発ログでは「およそ26ms」です。どちらかに合わせてください。 - 低(参考): 一覧を開いたまま日付が変わると、再描画されるまで「今日」の表示が残ります。また、長辺が65〜96セルの盤面は、
image-rendering: pixelatedのため、等倍の画面では縮小時に一部の段や目が抜けて見えます。どちらも実害は小さく、このPRで直さなくてもよいと思います。
満たしていない完了条件
- Issue #92 の完了条件「iPhoneとiPadで表示を確かめ、スクリーンショットをPRに付ける」と、AGENTS.mdの「UI変更のスクリーンショットをPRに含める」が未了です(本文にも「添付は未了」とあります)。スマホ幅とデスクトップ幅、iPhoneとiPadのスクリーンショットの添付が必要です。
マージはしていません。
The cache kept the first cell ArrayBuffer of every chart, so each list reload left one stale copy per chart (4 MB at 1000x1000). Compare only the id, size and update time, cap the cache at 200 entries, redraw the list when the date changes, and scale thumbnails larger than the frame smoothly so rows are not dropped. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Owner
Author
レビュー指摘の修正(2aed27b)
確認
残っていること
マージはしていません。 |
Owner
Author
デプロイ確認
途中の 本番(https://knittingeditor.com/)での確認Playwright で、Android Chrome 相当(Pixel 7)、iPhone Safari 相当(iPhone 14、WebKit)、デスクトップ幅(1440×900)の Chromium と WebKit の4通りで確かめました。どれも成功し、ページのエラーは出ませんでした。
|
This was referenced Oct 7, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
変更内容
「編み図」パネルの一覧の各項目に、盤面の縮小画像、寸法、更新日時を出すようにしました。Web版とiOS版の両方に入ります。
aria-currentを付けます。縮小画像は読み上げません。名前を先頭に置いたので、iOSのUIテストが名前の前方一致で項目を探す処理もそのまま使えます。EditorView.tsxの変更は一覧の部分を新しいui/DocumentList.tsxへ差し替えた数行だけです。#115 や #120 と同じ箇所の大きな書き換えを避けるため、新しい処理は新しいファイルに分けました。レビュー後の修正
ThumbnailCache)が、最初に受け取ったセル配列の参照を持ち続け、一覧を読み直すたびに古いセル配列(1000×1000で1件4MB)が残っていました。比較を編み図のID・寸法・更新日時だけにし、セル配列を持たないようにしました。同じセル配列の参照で更新日時だけが変わったときに古い縮小画像を返していた条件も無くしました。一覧から消えた編み図は従来どおり捨て、覚えておく数に上限(200件、最近使っていないものから捨てる)も設けました。pixelatedで縮めると等倍の画面で段や目が抜けて見えました。枠より大きいときだけ滑らかに縮めます。枠より小さい縮小画像は従来どおりセルの境目をぼかさずに拡大します。thumbnail.test.tsの所要時間のコメントを、実測(手元のNode.jsで1回25〜28ms、およそ26ms)に合わせました。決めたこと
Issue で「決める」とされていた点は、次のように決めました。
listDocumentsは、起動時と一覧の更新時に、すでに全編み図のセル配列を読み込んでいます。そのため、縮小画像を保存しても「全部の盤面を読み込む」費用は減りません。減らせるのは画像を作る計算だけです。その計算は、記号を描かずにセル配列を1回なめるだけにしました。1000×1000を埋めた盤面でも、手元のNode.jsで1件およそ26msです。IntersectionObserver)。編み図が多くても、一覧を開いた時点では見えている数件分しか計算しません。作った画像は、編み図ごとに更新日時が変わるまで覚えておきます。一覧を閉じて開き直したり、別の編み図の保存で一覧が描き直されたりしても、作り直しません。.knitも形式が変わらないので、DBの版上げも移行も要りません。既存のデータと、Web版・iOS版の.knitの互換に影響しません。DBの版は変えていないので、DBの版を変えていない feat: 最後のバックアップ日時を表示し、.knitの書き出しを勧める #120 の設定ストアへの追加とも衝突しません。保存した縮小画像と盤面が食い違うこと(保存の失敗や旧版での編集)も起こりません。.knitには含めない。 1と同じ理由です。復元した編み図は、一覧に出たときにセル配列から作ります。Boardと同じく描きません。実行した確認
npm run typecheck: 成功npm test: 30ファイル・191件成功(レビュー後の修正の時点)npm run build: 成功npm run check:dist: 成功npm run test:e2e: chromium-mobile、webkit-mobile、chromium-desktopで106件成功、2件は既存のスキップ。1回目は、今回触れていないPNGの太線のテスト(editor.spec.ts)がwebkit-mobileで1回だけ失敗しました。単独の再実行(webkit-mobileで8回)と全体の再実行では成功しています。tsc -p tsconfig.app.json --noEmit成功、vitest run --config vite.config.ts3ファイル・8件成功xcodegen generate --spec ios/project.yml: プロジェクトの差分なしCODE_SIGNING_ALLOWED=NO)とios/scripts/check-app-bundle.sh: 成功model/thumbnail.test.ts(作成、面積平均、旧形式、1000×1000を250ms以内、覚えておく置き場がセル配列を持たないこと・更新日時や寸法が変われば作り直すこと・消えたIDを捨てること・上限)storage/thumbnailCompatibility.test.ts(以前の版の記録と旧形式のセル、IndexedDBの記録と.knitの項目が変わらないこと、Web/iOS共有fixtureの縮小画像が盤面として読み込んだ結果と一致すること)ui/documentListText.test.ts(次の0時までの時間を含む)ui/DocumentList.test.tsx(開いたまま0時を過ぎたときと画面に戻ったときの書き直し、枠より大きい縮小画像だけ滑らかに縮めることを含む)tests/e2e/document-list.spec.ts(縮小画像と更新日時が出て、編集後に新しくなること。長い名前でもボタンが項目に収まり、押せる大きさで重ならないこと。1000段×250目の縮小画像が縦横比を保って枠に収まり、滑らかに縮めること。20×20はpixelatedで拡大すること)スクリーンショットは手元で確認済みですが、PRへの添付は未了です。
できなかった確認
懸念
Closes #92
🤖 Generated with Claude Code