fix(UI): Restored the scroll bar OHIF L&F (#5202)

This commit is contained in:
Joe Boccanfuso 2025-07-13 22:34:18 -04:00 committed by GitHub
parent a24ec13239
commit 94bdcf414d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
10 changed files with 66 additions and 6 deletions

View File

@ -1,4 +1,5 @@
import React from 'react'; import React from 'react';
import '../../tailwind.css'; import '../../tailwind.css';
import '../../assets/styles.css';
export const ThemeWrapper = ({ children }) => <React.Fragment>{children}</React.Fragment>; export const ThemeWrapper = ({ children }) => <React.Fragment>{children}</React.Fragment>;

View File

@ -24,6 +24,10 @@ export default defineConfig({
video: 'on-first-retry', video: 'on-first-retry',
testIdAttribute: 'data-cy', testIdAttribute: 'data-cy',
actionTimeout: 10_000, actionTimeout: 10_000,
launchOptions: {
// do not hide the scrollbars so that we can assert their look-and-feel
ignoreDefaultArgs: ['--hide-scrollbars'],
},
}, },
projects: [ projects: [

View File

@ -1,13 +1,11 @@
import { test } from 'playwright-test-coverage'; import { test } from 'playwright-test-coverage';
import { visitStudy, checkForScreenshot, screenShotPaths } from './utils'; import { visitStudy, checkForScreenshot, screenShotPaths } from './utils';
test.beforeEach(async ({ page }) => { test('should display the dicom tag browser', async ({ page }) => {
const studyInstanceUID = '1.3.6.1.4.1.25403.345050719074.3824.20170125095438.5'; const studyInstanceUID = '1.3.6.1.4.1.25403.345050719074.3824.20170125095438.5';
const mode = 'viewer'; const mode = 'viewer';
await visitStudy(page, studyInstanceUID, mode, 2000); await visitStudy(page, studyInstanceUID, mode, 2000);
});
test('should display the dicom tag browser', async ({ page }) => {
await page.getByTestId('MoreTools-split-button-secondary').click(); await page.getByTestId('MoreTools-split-button-secondary').click();
await page.getByTestId('TagBrowser').click(); await page.getByTestId('TagBrowser').click();
await checkForScreenshot( await checkForScreenshot(
@ -16,3 +14,17 @@ test('should display the dicom tag browser', async ({ page }) => {
screenShotPaths.dicomTagBrowser.dicomTagBrowserDisplayedCorrectly screenShotPaths.dicomTagBrowser.dicomTagBrowserDisplayedCorrectly
); );
}); });
test('should render the scroll bar with the correct look-and-feel', async ({ page }) => {
const studyInstanceUID = '1.3.6.1.4.1.25403.345050719074.3824.20170125095438.5';
const mode = 'viewer';
await visitStudy(page, studyInstanceUID, mode, 2000);
await page.getByTestId('MoreTools-split-button-secondary').click();
await page.getByTestId('TagBrowser').click();
await checkForScreenshot({
page,
normalizedClip: { x: 0.77, y: 0.25, width: 0.03, height: 0.75 },
screenshotPath: screenShotPaths.dicomTagBrowser.scrollBarRenderedProperly,
});
});

30
tests/Worklist.spec.ts Normal file
View File

@ -0,0 +1,30 @@
import { test } from 'playwright-test-coverage';
import { checkForScreenshot, screenShotPaths } from './utils';
test.beforeEach(async ({ page }) => {
await page.goto(`/?datasources=ohif`);
await page.waitForLoadState('domcontentloaded');
await page.waitForLoadState('networkidle');
await page.waitForTimeout(2000);
});
test('should render scroll bars with the correct look-and-feel', async ({ page }) => {
const studyRowHeader = await page.getByTestId(
'1.3.6.1.4.1.14519.5.2.1.5099.8010.217836670708542506360829799868'
);
await studyRowHeader.scrollIntoViewIfNeeded();
await studyRowHeader.click();
const expandedStudyRow = await page.getByTestId(
'studyRow-1.3.6.1.4.1.14519.5.2.1.5099.8010.217836670708542506360829799868'
);
await expandedStudyRow.scrollIntoViewIfNeeded();
await checkForScreenshot({
page,
locator: expandedStudyRow,
normalizedClip: { x: 0.97, y: 0.35, width: 0.03, height: 0.65 },
screenshotPath: screenShotPaths.workList.scrollBarRenderedProperly,
});
});

Binary file not shown.

Before

Width:  |  Height:  |  Size: 145 KiB

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 999 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 687 B

View File

@ -15,20 +15,23 @@ type CheckForScreenshotProps = {
width: number; width: number;
height: number; height: number;
}; };
fullPage?: boolean;
}; };
const _checkForScreenshot = async (props: CheckForScreenshotProps) => { const _checkForScreenshot = async (props: CheckForScreenshotProps) => {
const { const {
page, page,
locator = page,
screenshotPath, screenshotPath,
attempts = 10, attempts = 10,
delay = 500, delay = 500,
maxDiffPixelRatio = 0.02, maxDiffPixelRatio = 0.02,
threshold = 0.05, threshold = 0.05,
normalizedClip, normalizedClip,
fullPage = false,
} = props; } = props;
let { locator = page } = props;
await page.waitForLoadState('networkidle'); await page.waitForLoadState('networkidle');
for (let i = 0; i < attempts; i++) { for (let i = 0; i < attempts; i++) {
@ -40,11 +43,16 @@ const _checkForScreenshot = async (props: CheckForScreenshotProps) => {
boundingBox = { x: 0, y: 0, ...(await page.viewportSize()) }; boundingBox = { x: 0, y: 0, ...(await page.viewportSize()) };
} else { } else {
boundingBox = await (locator as Locator).boundingBox(); boundingBox = await (locator as Locator).boundingBox();
// clip does not work for locator screen shots, so lets do some trickery
// set page as the locator here and below add the locator bounding box origin to the
// clip area
locator = page;
} }
clip = { clip = {
x: normalizedClip.x * boundingBox.width, x: boundingBox.x + normalizedClip.x * boundingBox.width,
y: normalizedClip.y * boundingBox.height, y: boundingBox.y + normalizedClip.y * boundingBox.height,
width: normalizedClip.width * boundingBox.width, width: normalizedClip.width * boundingBox.width,
height: normalizedClip.height * boundingBox.height, height: normalizedClip.height * boundingBox.height,
}; };
@ -54,6 +62,7 @@ const _checkForScreenshot = async (props: CheckForScreenshotProps) => {
maxDiffPixelRatio, maxDiffPixelRatio,
threshold, threshold,
clip, clip,
fullPage,
}); });
return true; return true;
} catch (error) { } catch (error) {

View File

@ -60,6 +60,7 @@ const screenShotPaths = {
}, },
dicomTagBrowser: { dicomTagBrowser: {
dicomTagBrowserDisplayedCorrectly: 'dicomTagBrowserDisplayedCorrectly.png', dicomTagBrowserDisplayedCorrectly: 'dicomTagBrowserDisplayedCorrectly.png',
scrollBarRenderedProperly: 'scrollBarRenderedProperly.png',
}, },
rotateRight: { rotateRight: {
rotateRightDisplayedCorrectly: 'rotateRightDisplayedCorrectly.png', rotateRightDisplayedCorrectly: 'rotateRightDisplayedCorrectly.png',
@ -178,6 +179,9 @@ const screenShotPaths = {
overlaysDisplayed: 'overlaysDisplayed.png', overlaysDisplayed: 'overlaysDisplayed.png',
overlaySEGsAndRTDisplayed: 'overlaySEGsAndRTDisplayed.png', overlaySEGsAndRTDisplayed: 'overlaySEGsAndRTDisplayed.png',
}, },
workList: {
scrollBarRenderedProperly: 'scrollBarRenderedProperly.png',
},
}; };
export { screenShotPaths }; export { screenShotPaths };