Skip to content

Commit 4459738

Browse files
fix(admin): アップロード未完了の添付画像を非表示 + build/ を git 管理から除外
- stg で確認された「画像リンク切れ」は、テスト作成の報告がメタデータ (screenshotCount 等) だけ登録して実ファイルを S3 にアップロードして いないことが原因 (presigned URL は有効だがオブジェクトが 404)。 本番でもアップロード途中失敗で起こり得るため、サムネイル・ スクリーンショットの img に onError で非表示にする防御を追加 - packages/admin/build/ が S2/S3 のコミットに誤って混入していたため git 管理から外し、packages/admin/.gitignore を追加 (build 成果物は コミットしない規約) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent db81cde commit 4459738

6 files changed

Lines changed: 25 additions & 42 deletions

File tree

packages/admin/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
build/
2+
node_modules/

packages/admin/build/admin.d51173360316dfecd5b2.js

Lines changed: 0 additions & 2 deletions
This file was deleted.

packages/admin/build/admin.d51173360316dfecd5b2.js.LICENSE.txt

Lines changed: 0 additions & 39 deletions
This file was deleted.

packages/admin/build/index.html

Lines changed: 0 additions & 1 deletion
This file was deleted.

packages/admin/src/components/bug-reports-view.jsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,13 @@ const formatDate = iso => (iso ?
3737
// older ones as a string — render both.
3838
const asText = value => (typeof value === 'string' ? value : JSON.stringify(value, null, 2));
3939

40+
// A report can declare attachments whose upload never completed (the S3
41+
// object 404s even though the presigned URL is valid) — hide those instead
42+
// of showing a broken image.
43+
const hideBrokenImage = event => {
44+
event.currentTarget.style.display = 'none';
45+
};
46+
4047
const BugReportDetail = ({reportId, onBack}) => {
4148
const [detail, setDetail] = useState(null);
4249
const [error, setError] = useState('');
@@ -108,6 +115,7 @@ const BugReportDetail = ({reportId, onBack}) => {
108115
data-testid={`bug-admin-screenshot-${index}`}
109116
key={index}
110117
src={url}
118+
onError={hideBrokenImage}
111119
/>
112120
))}
113121
</div>
@@ -192,6 +200,7 @@ const BugReportsView = () => {
192200
alt=""
193201
className="admin-thumb"
194202
src={report.thumbnailUrl}
203+
onError={hideBrokenImage}
195204
/>
196205
) : null}
197206
<strong>{report.projectName || '(プロジェクト名なし)'}</strong>

packages/admin/test/unit/bug-reports-view.test.jsx

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,20 @@ describe('BugReportsView (issue #1085, read-only)', () => {
7272
expect(mockFetchReport).toHaveBeenCalledWith('r1');
7373
});
7474

75+
test('an attachment whose upload never completed is hidden, not broken', async () => {
76+
render(<BugReportsView />);
77+
await waitFor(() => screen.getByTestId('bug-admin-item-r1'));
78+
const thumb = screen.getByTestId('bug-admin-item-r1').querySelector('img');
79+
fireEvent.error(thumb);
80+
expect(thumb).toHaveStyle({display: 'none'});
81+
82+
fireEvent.click(screen.getByTestId('bug-admin-item-r1'));
83+
await waitFor(() => screen.getByTestId('bug-admin-detail'));
84+
const screenshot = screen.getByTestId('bug-admin-screenshot-0');
85+
fireEvent.error(screenshot);
86+
expect(screenshot).toHaveStyle({display: 'none'});
87+
});
88+
7589
test('an API error surfaces instead of the list', async () => {
7690
mockFetchReports.mockRejectedValue(new Error('Administrator privileges are required'));
7791
render(<BugReportsView />);

0 commit comments

Comments
 (0)