diff --git a/docs/frontend-analytics-manifest.json b/docs/frontend-analytics-manifest.json index 50b28ec07..ba741af2f 100644 --- a/docs/frontend-analytics-manifest.json +++ b/docs/frontend-analytics-manifest.json @@ -39,8 +39,8 @@ {"name":"dashboardReviewsRoute","path":"dashboard/reviews","declaration":{"file":"web/src/app/router.tsx","line":598},"implementation":{"file":"web/src/pages/dashboard/reviews.tsx","line":31,"export":"ReviewsPage"},"guarded":true,"roleProtected":false}, {"name":"dashboardReviewProgressRoute","path":"dashboard/review-progress","declaration":{"file":"web/src/app/router.tsx","line":606},"implementation":{"file":"web/src/pages/dashboard/review-progress.tsx","line":27,"export":"ReviewProgressPage"},"guarded":true,"roleProtected":false}, {"name":"dashboardReportsRoute","path":"dashboard/reports","declaration":{"file":"web/src/app/router.tsx","line":628},"implementation":{"file":"web/src/pages/dashboard/reports.tsx","line":31,"export":"ReportsPage"},"guarded":true,"roleProtected":true}, - {"name":"dashboardReviewDetailRoute","path":"dashboard/reviews/$id","declaration":{"file":"web/src/app/router.tsx","line":635},"implementation":{"file":"web/src/pages/dashboard/review-detail.tsx","line":452,"export":"ReviewDetailPage"},"guarded":true,"roleProtected":false}, - {"name":"dashboardNamespaceReviewDetailRoute","path":"dashboard/namespaces/$slug/reviews/$id","declaration":{"file":"web/src/app/router.tsx","line":643},"implementation":{"file":"web/src/pages/dashboard/review-detail.tsx","line":465,"export":"NamespaceReviewDetailPage"},"guarded":true,"roleProtected":false}, + {"name":"dashboardReviewDetailRoute","path":"dashboard/reviews/$id","declaration":{"file":"web/src/app/router.tsx","line":635},"implementation":{"file":"web/src/pages/dashboard/review-detail.tsx","line":483,"export":"ReviewDetailPage"},"guarded":true,"roleProtected":false}, + {"name":"dashboardNamespaceReviewDetailRoute","path":"dashboard/namespaces/$slug/reviews/$id","declaration":{"file":"web/src/app/router.tsx","line":643},"implementation":{"file":"web/src/pages/dashboard/review-detail.tsx","line":496,"export":"NamespaceReviewDetailPage"},"guarded":true,"roleProtected":false}, {"name":"dashboardPromotionsRoute","path":"dashboard/promotions","declaration":{"file":"web/src/app/router.tsx","line":651},"implementation":{"file":"web/src/pages/dashboard/promotions.tsx","line":408,"export":"PromotionsPage"},"guarded":true,"roleProtected":true}, {"name":"dashboardStarsRoute","path":"dashboard/stars","declaration":{"file":"web/src/app/router.tsx","line":658},"implementation":{"file":"web/src/pages/dashboard/stars.tsx","line":12,"export":"MyStarsPage"},"guarded":true,"roleProtected":false}, {"name":"dashboardSubscriptionsRoute","path":"dashboard/subscriptions","declaration":{"file":"web/src/app/router.tsx","line":668},"implementation":{"file":"web/src/pages/dashboard/subscriptions.tsx","line":12,"export":"MySubscriptionsPage"},"guarded":true,"roleProtected":false}, @@ -276,15 +276,15 @@ {"file":"web/src/features/review/review-center-filter-form.tsx","line":34,"host":"SelectItem","prop":"data-analytics-id","event":"radix-item-intent","ids":["review.filter.kind.select","review.filter.namespace.select","review.filter.origin.select","review.filter.status.select"],"conditional":true}, {"file":"web/src/features/review/review-center-filter-form.tsx","line":55,"host":"Button","prop":"data-analytics-id","event":"click","ids":["review.filter.reset"]}, {"file":"web/src/features/review/review-center-filter-form.tsx","line":56,"host":"Button","prop":"data-analytics-id","event":"click","ids":["review.filter.apply"]}, - {"file":"web/src/features/review/review-skill-detail-section.tsx","line":45,"host":"Button","prop":"data-analytics-id","event":"click","ids":["review.content.retry"]}, - {"file":"web/src/features/review/review-skill-detail-section.tsx","line":86,"host":"a","prop":"data-analytics-id","event":"click","ids":["review.package.download"]}, - {"file":"web/src/features/review/review-skill-detail-section.tsx","line":91,"host":"summary","prop":"data-analytics-id","event":"click","ids":["review.files.expand"]}, - {"file":"web/src/features/review/review-skill-detail-section.tsx","line":97,"host":"FileTree","prop":"analyticsId","event":"click","ids":["review.file.open"]}, - {"file":"web/src/features/review/review-skill-detail-section.tsx","line":110,"host":"a","prop":"data-analytics-id","event":"click","ids":["review.file.download"]}, - {"file":"web/src/features/review/review-skill-detail-section.tsx","line":123,"host":"a","prop":"data-analytics-id","event":"click","ids":["review.file.download"]}, - {"file":"web/src/features/review/review-skill-detail-section.tsx","line":132,"host":"FilePreviewDialog","prop":"closeAnalyticsId","event":"click","ids":["review.file.close"]}, - {"file":"web/src/features/review/review-skill-detail-section.tsx","line":132,"host":"FilePreviewDialog","prop":"downloadAnalyticsId","event":"click","ids":["review.file.download"]}, - {"file":"web/src/features/review/review-skill-detail-section.tsx","line":132,"host":"FilePreviewDialog","prop":"copyAnalyticsId","event":"click","ids":["review.file.copy"]}, + {"file":"web/src/features/review/review-skill-detail-section.tsx","line":47,"host":"Button","prop":"data-analytics-id","event":"click","ids":["review.content.retry"]}, + {"file":"web/src/features/review/review-skill-detail-section.tsx","line":75,"host":"Button","prop":"data-analytics-id","event":"click","ids":["review.files.expand"]}, + {"file":"web/src/features/review/review-skill-detail-section.tsx","line":79,"host":"a","prop":"data-analytics-id","event":"click","ids":["review.package.download"]}, + {"file":"web/src/features/review/review-skill-detail-section.tsx","line":96,"host":"FileTree","prop":"analyticsId","event":"click","ids":["review.file.open"]}, + {"file":"web/src/features/review/review-skill-detail-section.tsx","line":109,"host":"a","prop":"data-analytics-id","event":"click","ids":["review.file.download"]}, + {"file":"web/src/features/review/review-skill-detail-section.tsx","line":122,"host":"a","prop":"data-analytics-id","event":"click","ids":["review.file.download"]}, + {"file":"web/src/features/review/review-skill-detail-section.tsx","line":139,"host":"FilePreviewDialog","prop":"closeAnalyticsId","event":"click","ids":["review.file.close"]}, + {"file":"web/src/features/review/review-skill-detail-section.tsx","line":139,"host":"FilePreviewDialog","prop":"downloadAnalyticsId","event":"click","ids":["review.file.download"]}, + {"file":"web/src/features/review/review-skill-detail-section.tsx","line":139,"host":"FilePreviewDialog","prop":"copyAnalyticsId","event":"click","ids":["review.file.copy"]}, {"file":"web/src/features/search/search-bar.tsx","line":55,"host":"form","prop":"data-analytics-id","event":"submit","ids":[],"conditional":true,"forward":"analyticsId"}, {"file":"web/src/features/search/search-bar.tsx","line":67,"host":"button","prop":"data-analytics-id","event":"click","ids":["search.query.clear"],"conditional":true}, {"file":"web/src/features/security-audit/security-audit-section.tsx","line":114,"host":"Button","prop":"data-analytics-id","event":"click","ids":["security.findings.toggle"]}, @@ -669,23 +669,23 @@ {"file":"web/src/pages/dashboard/reports.tsx","line":210,"host":"TabsTrigger","prop":"data-analytics-id","event":"click","ids":["report.dismissed.tab"]}, {"file":"web/src/pages/dashboard/reports.tsx","line":224,"host":"ConfirmDialog","prop":"confirmAnalyticsId","event":"click","ids":["report.archive.confirm","report.dismiss.confirm","report.hide.confirm","report.resolve.confirm"],"conditional":true}, {"file":"web/src/pages/dashboard/reports.tsx","line":224,"host":"ConfirmDialog","prop":"cancelAnalyticsId","event":"click","ids":["report.archive.cancel","report.dismiss.cancel","report.hide.cancel","report.resolve.cancel"],"conditional":true}, - {"file":"web/src/pages/dashboard/review-detail.tsx","line":194,"host":"Button","prop":"data-analytics-id","event":"click","ids":["review.list.open"]}, - {"file":"web/src/pages/dashboard/review-detail.tsx","line":205,"host":"Button","prop":"data-analytics-id","event":"click","ids":["review.list.open"]}, - {"file":"web/src/pages/dashboard/review-detail.tsx","line":221,"host":"TabsTrigger","prop":"data-analytics-id","event":"click","ids":["review.content.tab"]}, - {"file":"web/src/pages/dashboard/review-detail.tsx","line":222,"host":"TabsTrigger","prop":"data-analytics-id","event":"click","ids":["review.changes.tab"]}, - {"file":"web/src/pages/dashboard/review-detail.tsx","line":223,"host":"TabsTrigger","prop":"data-analytics-id","event":"click","ids":["review.source.tab"]}, - {"file":"web/src/pages/dashboard/review-detail.tsx","line":224,"host":"TabsTrigger","prop":"data-analytics-id","event":"click","ids":["review.history.tab"]}, - {"file":"web/src/pages/dashboard/review-detail.tsx","line":260,"host":"Button","prop":"data-analytics-id","event":"click","ids":["review.suite.retry"]}, - {"file":"web/src/pages/dashboard/review-detail.tsx","line":326,"host":"button","prop":"data-analytics-id","event":"click","ids":["review.security.open"]}, - {"file":"web/src/pages/dashboard/review-detail.tsx","line":335,"host":"button","prop":"data-analytics-id","event":"click","ids":["review.source.open"]}, - {"file":"web/src/pages/dashboard/review-detail.tsx","line":361,"host":"Button","prop":"data-analytics-id","event":"click","ids":["review.reject.open"]}, - {"file":"web/src/pages/dashboard/review-detail.tsx","line":372,"host":"Button","prop":"data-analytics-id","event":"click","ids":["review.reject.request"]}, - {"file":"web/src/pages/dashboard/review-detail.tsx","line":387,"host":"Button","prop":"data-analytics-id","event":"click","ids":["review.reject.cancel"]}, - {"file":"web/src/pages/dashboard/review-detail.tsx","line":398,"host":"Button","prop":"data-analytics-id","event":"click","ids":["review.approve.request"]}, - {"file":"web/src/pages/dashboard/review-detail.tsx","line":430,"host":"ConfirmDialog","prop":"confirmAnalyticsId","event":"click","ids":["review.approve.confirm"]}, - {"file":"web/src/pages/dashboard/review-detail.tsx","line":430,"host":"ConfirmDialog","prop":"cancelAnalyticsId","event":"click","ids":["review.approve.cancel"]}, - {"file":"web/src/pages/dashboard/review-detail.tsx","line":439,"host":"ConfirmDialog","prop":"confirmAnalyticsId","event":"click","ids":["review.reject.confirm"]}, - {"file":"web/src/pages/dashboard/review-detail.tsx","line":439,"host":"ConfirmDialog","prop":"cancelAnalyticsId","event":"click","ids":["review.reject.cancel"]}, + {"file":"web/src/pages/dashboard/review-detail.tsx","line":213,"host":"Button","prop":"data-analytics-id","event":"click","ids":["review.list.open"]}, + {"file":"web/src/pages/dashboard/review-detail.tsx","line":225,"host":"button","prop":"data-analytics-id","event":"click","ids":["review.security.open"]}, + {"file":"web/src/pages/dashboard/review-detail.tsx","line":234,"host":"button","prop":"data-analytics-id","event":"click","ids":["review.source.open"]}, + {"file":"web/src/pages/dashboard/review-detail.tsx","line":243,"host":"Button","prop":"data-analytics-id","event":"click","ids":["review.list.open"]}, + {"file":"web/src/pages/dashboard/review-detail.tsx","line":266,"host":"TabsTrigger","prop":"data-analytics-id","event":"click","ids":["review.content.tab"]}, + {"file":"web/src/pages/dashboard/review-detail.tsx","line":267,"host":"TabsTrigger","prop":"data-analytics-id","event":"click","ids":["review.changes.tab"]}, + {"file":"web/src/pages/dashboard/review-detail.tsx","line":268,"host":"TabsTrigger","prop":"data-analytics-id","event":"click","ids":["review.source.tab"]}, + {"file":"web/src/pages/dashboard/review-detail.tsx","line":269,"host":"TabsTrigger","prop":"data-analytics-id","event":"click","ids":["review.history.tab"]}, + {"file":"web/src/pages/dashboard/review-detail.tsx","line":307,"host":"Button","prop":"data-analytics-id","event":"click","ids":["review.suite.retry"]}, + {"file":"web/src/pages/dashboard/review-detail.tsx","line":392,"host":"Button","prop":"data-analytics-id","event":"click","ids":["review.reject.open"]}, + {"file":"web/src/pages/dashboard/review-detail.tsx","line":403,"host":"Button","prop":"data-analytics-id","event":"click","ids":["review.reject.request"]}, + {"file":"web/src/pages/dashboard/review-detail.tsx","line":418,"host":"Button","prop":"data-analytics-id","event":"click","ids":["review.reject.cancel"]}, + {"file":"web/src/pages/dashboard/review-detail.tsx","line":429,"host":"Button","prop":"data-analytics-id","event":"click","ids":["review.approve.request"]}, + {"file":"web/src/pages/dashboard/review-detail.tsx","line":461,"host":"ConfirmDialog","prop":"confirmAnalyticsId","event":"click","ids":["review.approve.confirm"]}, + {"file":"web/src/pages/dashboard/review-detail.tsx","line":461,"host":"ConfirmDialog","prop":"cancelAnalyticsId","event":"click","ids":["review.approve.cancel"]}, + {"file":"web/src/pages/dashboard/review-detail.tsx","line":470,"host":"ConfirmDialog","prop":"confirmAnalyticsId","event":"click","ids":["review.reject.confirm"]}, + {"file":"web/src/pages/dashboard/review-detail.tsx","line":470,"host":"ConfirmDialog","prop":"cancelAnalyticsId","event":"click","ids":["review.reject.cancel"]}, {"file":"web/src/pages/dashboard/review-progress.tsx","line":79,"host":"form","prop":"data-analytics-id","event":"submit","ids":["review.progress.search"]}, {"file":"web/src/pages/dashboard/review-progress.tsx","line":100,"host":"SelectTrigger","prop":"data-analytics-id","event":"click+keydown-intent","ids":["review.progress.type.interact"]}, {"file":"web/src/pages/dashboard/review-progress.tsx","line":104,"host":"SelectItem","prop":"data-analytics-id","event":"radix-item-intent","ids":["review.progress.type"]}, diff --git a/docs/skillhub/en/guide/review.md b/docs/skillhub/en/guide/review.md index 55349843e..405f204ee 100644 --- a/docs/skillhub/en/guide/review.md +++ b/docs/skillhub/en/guide/review.md @@ -51,7 +51,7 @@ Online preview limits are listed together below. Exceeding a limit does not mean These are frontend/API implementation limits, not review-page settings. Sources: [review detail page](https://github.com/iflytek/skillhub/blob/main/web/src/pages/dashboard/review-detail.tsx) and [review API](https://github.com/iflytek/skillhub/blob/main/server/skillhub-app/src/main/java/com/iflytek/skillhub/controller/portal/ReviewController.java). `GET /api/v1/reviews/{id}/skill-detail?includeDocumentation=false` reads metadata, custom web/package presentation and the documentation path without fetching object-storage content; README or SKILL.md fallback content is loaded on demand; the default is `true`. -Switching content tabs or opening evidence from the side panel aligns the content container below the header. Query completion and comment edits do not reset the reading position. Content uses the main page scroll rather than a nested scrolling region. +Switching tabs or opening evidence smoothly returns to the detail page top, including its heading; reduced motion uses direct positioning. Query completion and comment edits do not reset the reading position. The summary has a distinct section, with package download and file browsing available before the overview. Comparison uses the available main width and stacks on narrow screens. Content uses the main page scroll. ### Understand Changes diff --git a/docs/skillhub/guide/review.md b/docs/skillhub/guide/review.md index 3bd0f4089..e42144197 100644 --- a/docs/skillhub/guide/review.md +++ b/docs/skillhub/guide/review.md @@ -51,7 +51,7 @@ 这些是前端/接口实现限制,不由审核页面配置;依据[审核详情](https://github.com/iflytek/skillhub/blob/main/web/src/pages/dashboard/review-detail.tsx)及[审核接口](https://github.com/iflytek/skillhub/blob/main/server/skillhub-app/src/main/java/com/iflytek/skillhub/controller/portal/ReviewController.java)。`GET /api/v1/reviews/{id}/skill-detail?includeDocumentation=false` 读取元数据、网页或包内自定义展示内容及说明路径,不读取对象存储正文;README 或 SKILL.md 回退正文需按需读取;缺省为 `true`。 -切换内容页签或点击右侧核查入口时,页面定位至内容容器顶部;异步加载及填写审核意见不重复改变阅读位置。正文随主页面滚动,不另设内部滚动区域。 +切换内容页签或点击核查入口时,页面平滑回到包含标题的详情页顶部;系统开启减少动态效果时直接定位。异步加载及填写审核意见不重复改变阅读位置。简介独立展示,下载与文件浏览位于内容顶部;变更对比使用主区域全宽,窄屏上下排列。正文随主页面滚动。 ### 理解变更对比 diff --git a/openspec/changes/unify-review-workbench/design.md b/openspec/changes/unify-review-workbench/design.md index ad041595c..de1dbad11 100644 --- a/openspec/changes/unify-review-workbench/design.md +++ b/openspec/changes/unify-review-workbench/design.md @@ -22,11 +22,13 @@ 详情顶部仅任务标题与事项,主区有效简介/概述及原文件,右侧标准Card集中摘要和证据。按任务决定Tab,包内容加载失败不能用已发布旧内容冒充;扫描、头像、许可证和并发决定仍遵守原服务条件。已有任务已处理后只读。 -### 人工预览后的内容容器与定位修订 +### 人工预览后的内容层次与定位修订 -审核详情的Tab导航与当前内容合入同一有边界的内容容器,内部保留阅读间距;主页面统一滚动,不增加正文内部滚动条。短内容使用与视口相关的最小高度,保证导航能在固定页头下方对齐,不复制上一长面板的整段空白高度。 +Tab导航与正文保留统一边界。简介使用独立浅底摘要区;详细概述保留清晰的正文标题与阅读间距。下载与浏览原文件入口放在内容顶部,文件区在简介之后、概述之前按需展开,不要求读完长概述后寻找入口。 -用户切换Tab或点击右侧证据入口后,在新面板布局提交时立即定位到容器顶部;重复点击当前证据入口同样定位,并将焦点移至所选页签;普通页签导航保留自身焦点。异步查询完成、首次渲染及审核意见输入不重复触发定位。减少动态偏好下关闭内容淡入,不以长距离平滑滚动延迟内容可用。 +变更对比占详情可用主区域全宽,申请摘要的折叠入口位于标题之后、对比之前;其他Tab保留双栏。对比按容器宽度自适应并排或上下展示,避免窄列。已修改字段默认展开,以状态文字和修改后底色凸显;未变化字段可展开查看,缺失概述不得标为未变化。Markdown字号仅在比较区局部收敛。 + +用户切换Tab或点击右侧证据入口后,平滑回到详情页顶部(包含标题),而非仅对齐Tab容器;减少动态偏好下直接定位。重复点击当前证据入口同样响应,并将焦点移至所选页签;普通页签导航保留自身焦点。异步查询完成、首次渲染及审核意见输入不重复触发定位,不维护动画队列。 ## 取舍 diff --git a/openspec/changes/unify-review-workbench/specs/review-workbench/spec.md b/openspec/changes/unify-review-workbench/specs/review-workbench/spec.md index 59a5f1bb2..e89439662 100644 --- a/openspec/changes/unify-review-workbench/specs/review-workbench/spec.md +++ b/openspec/changes/unify-review-workbench/specs/review-workbench/spec.md @@ -60,9 +60,20 @@ The confirmed dual-column detail MUST put readable target content in the main co ### Requirement: Stable detail navigation and content boundaries -The review detail MUST group the navigation and active content in one bounded surface without a nested page scrollbar. A user-initiated tab switch or evidence shortcut MUST align that surface below the fixed header after the new panel commits, including selecting the current evidence tab again. Query completion, initial rendering and comment edits MUST NOT trigger this navigation scroll. +The review detail MUST group the navigation and active content in one bounded surface without a nested page scrollbar. A user-initiated tab switch or evidence shortcut MUST return to the detail page top, including its heading, after the new panel commits, including selecting the current evidence tab again. Query completion, initial rendering and comment edits MUST NOT trigger this navigation scroll. #### Scenario: A long comparison is replaced with a short history panel - **WHEN** the reviewer switches from a scrolled long comparison to history or opens scan evidence from the side panel -- **THEN** the selected panel starts below the fixed header rather than at the document bottom +- **THEN** the detail heading is visible at the page top rather than leaving the reviewer at the document bottom - **AND** later query completion does not reset the reviewer's reading position + + +#### Scenario: Navigation respects motion preferences +- **WHEN** the reviewer switches tabs or opens evidence +- **THEN** normal motion preferences use smooth scrolling to the page top +- **AND** reduced motion uses direct positioning without a queued animation + +#### Scenario: Presentation and files are discoverable before a long overview +- **THEN** the summary is visually distinct from the overview +- **AND** file browsing and package download are available before the long overview +- **AND** comparison uses the available main width with responsive columns and explicit changed states diff --git a/web/src/features/review/review-presentation-comparison.test.tsx b/web/src/features/review/review-presentation-comparison.test.tsx index 0cac205d5..0ba3c9a57 100644 --- a/web/src/features/review/review-presentation-comparison.test.tsx +++ b/web/src/features/review/review-presentation-comparison.test.tsx @@ -1,10 +1,14 @@ +/** @vitest-environment jsdom */ import { renderToStaticMarkup } from 'react-dom/server' -import { describe, expect, it, vi } from 'vitest' +import { afterEach, describe, expect, it, vi } from 'vitest' +import { cleanup, fireEvent, render, screen } from '@testing-library/react' import type { ReviewSkillDetail } from '@/api/types' import { ReviewPresentationComparison } from './review-presentation-comparison' vi.mock('react-i18next', () => ({ useTranslation: () => ({ t: (key: string) => key }) })) -vi.mock('@/features/skill/markdown-renderer', () => ({ MarkdownRenderer: ({ content }: { content: string }) =>
{t('reviewWorkbench.baseline')}
{comparison.baseVersion}
{t('reviewWorkbench.pending')}
{detail.activeVersion}
{t(`reviewWorkbench.${label}`)}
- {value ? markdown ?{value}
+{t(`reviewWorkbench.${label}`)}
+ {value ? markdown ?{value}
:{t(markdown && snapshot.overviewSource !== 'NONE' ? 'reviewWorkbench.overviewUnavailable' : 'reviewWorkbench.notProvided')}
}{t('skillDetail.noFiles')}
} diff --git a/web/src/features/review/review-skill-detail-section.test.tsx b/web/src/features/review/review-skill-detail-section.test.tsx index 25a816d43..06b27c6cc 100644 --- a/web/src/features/review/review-skill-detail-section.test.tsx +++ b/web/src/features/review/review-skill-detail-section.test.tsx @@ -1,5 +1,7 @@ +/** @vitest-environment jsdom */ import { renderToStaticMarkup } from 'react-dom/server' -import { describe, expect, it, vi } from 'vitest' +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { cleanup, fireEvent, render, screen, within } from '@testing-library/react' import type { ReviewSkillDetail } from '@/api/types' import { ReviewSkillDetailSection } from './review-skill-detail-section' @@ -15,10 +17,10 @@ vi.mock('react-i18next', async () => { } }) -// Mock the review file hook to avoid QueryClient dependency in static rendering -vi.mock('./use-review-file', () => ({ - useReviewFile: () => ({ data: null, isLoading: false, error: null }), -})) +const mocks = vi.hoisted(() => ({ file: vi.fn(), refetch: vi.fn() })) +vi.mock('./use-review-file', () => ({ useReviewFile: (...args: unknown[]) => mocks.file(...args) })) +beforeEach(() => { vi.clearAllMocks(); mocks.file.mockReturnValue({ data: null, isLoading: false, error: null, refetch: mocks.refetch }) }) +afterEach(cleanup) function createDetail(): ReviewSkillDetail { return { @@ -77,19 +79,66 @@ describe('ReviewSkillDetailSection', () => { expect(html).toContain('Custom pending summary') expect(html).toContain('Custom pending overview') expect(html).not.toContain('Old public summary') - expect(html).toContain('Original README content') - expect(html.indexOf('Custom pending overview')).toBeLessThan(html.indexOf('Original README content')) - expect(html).toContain('reviewWorkbench.originalFiles') - expect(html).toContain('{t('reviewWorkbench.boundContent', { version: detail.activeVersion })}
+{t('reviewWorkbench.boundContent', { version: detail.activeVersion })}
+{summary || t('reviewWorkbench.notProvided')}
+{t('reviewWorkbench.originalFiles')}
{t('skillDetail.noFiles')}
} +{t('review.documentationLoadFailed')}
+ + {detail.documentationPath && reviewId && ( + + {t('filePreview.downloadFile')} + + )} +{documentation.path}
+{t('review.documentationTooLarge')}
+ + {t('filePreview.downloadFile')} + +{t('review.noDocumentation')}
} +{t('review.documentationLoadFailed')}
{onRetry && }{t(documentationTooLarge ? 'review.documentationTooLarge' : 'reviewWorkbench.notProvided')}
} -{t('reviewWorkbench.originalFiles')}
{t('skillDetail.noFiles')}
} -{t('review.documentationLoadFailed')}
- - {detail.documentationPath && reviewId && ( - - {t('filePreview.downloadFile')} - - )} -{documentation.path}
-{t('review.documentationTooLarge')}
- - {t('filePreview.downloadFile')} - -{t('review.noDocumentation')}
} -{t('reviewWorkbench.scanBoundary')}
+{t('reviewWorkbench.scanBoundary')}
-