Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

UIREQMED-76: Fix accessibility issues related to mediated requests list #90

Merged
merged 1 commit into from
Jan 27, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
* Increase code coverage of RequestForm.js file by jest/RTL tests. Refs UIREQMED-69.
* Fix issue with search field when user clears search value. Refs UIREQMED-75.
* Fix accessibility issues. Refs UIREQMED-74.
* Fix accessibility issues related to mediated requests list. Refs UIREQMED-76.

## [2.0.1] (https://github.com/folio-org/ui-requests-mediated/tree/v2.0.1) (2024-12-06)
[Full Changelog](https://github.com/folio-org/ui-requests-mediated/compare/v2.0.0...v2.0.1)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import PropTypes from 'prop-types';
import {
useHistory,
useLocation,
} from 'react-router-dom';
import {
Expand All @@ -15,6 +14,7 @@ import {
MultiColumnList,
FormattedTime,
MCLPagingTypes,
TextLink,
} from '@folio/stripes/components';

import {
Expand Down Expand Up @@ -55,9 +55,13 @@ export const COLUMN_WIDTHS = {
[MEDIATED_REQUESTS_RECORD_FIELD_NAME.REQUESTER]: { max: 120 },
[MEDIATED_REQUESTS_RECORD_FIELD_NAME.REQUESTER_BARCODE]: { max: 120 },
};
export const mediatedRequestsListFormatter = {
export const getMediatedRequestsListFormatter = (location) => ({
[MEDIATED_REQUESTS_RECORD_FIELD_NAME.TITLE]: (mediatedRequest) => (
get(mediatedRequest, MEDIATED_REQUESTS_RECORD_FIELD_PATH[MEDIATED_REQUESTS_RECORD_FIELD_NAME.TITLE], DEFAULT_VIEW_VALUE)
<TextLink
to={`/${MODULE_ROUTE}/${MEDIATED_REQUESTS_ACTIVITIES}/preview/${mediatedRequest[MEDIATED_REQUESTS_RECORD_FIELD_NAME.ID]}${location.search}`}
>
{get(mediatedRequest, MEDIATED_REQUESTS_RECORD_FIELD_PATH[MEDIATED_REQUESTS_RECORD_FIELD_NAME.TITLE], DEFAULT_VIEW_VALUE)}
</TextLink>
),
[MEDIATED_REQUESTS_RECORD_FIELD_NAME.ITEM_BARCODE]: (mediatedRequest) => (
get(mediatedRequest, MEDIATED_REQUESTS_RECORD_FIELD_PATH[MEDIATED_REQUESTS_RECORD_FIELD_NAME.ITEM_BARCODE], DEFAULT_VIEW_VALUE)
Expand Down Expand Up @@ -87,7 +91,7 @@ export const mediatedRequestsListFormatter = {
[MEDIATED_REQUESTS_RECORD_FIELD_NAME.REQUESTER_BARCODE]: (mediatedRequest) => (
get(mediatedRequest, MEDIATED_REQUESTS_RECORD_FIELD_PATH[MEDIATED_REQUESTS_RECORD_FIELD_NAME.REQUESTER_BARCODE], DEFAULT_VIEW_VALUE)
),
};
});
export const emptyMessage = (source, query) => (
source
? <SearchAndSortNoResultsMessage
Expand All @@ -107,15 +111,10 @@ const MediatedRequestsList = ({
onSort,
onNeedMoreData,
}) => {
const history = useHistory();
const location = useLocation();
const sortOrder = query.sort || '';
const totalCount = getTotalCount(source);

const onRowClick = (e, row) => {
history.push(`/${MODULE_ROUTE}/${MEDIATED_REQUESTS_ACTIVITIES}/preview/${row.id}${location.search}`);
};

return (
<MultiColumnList
id="mediatedRequestsList"
Expand All @@ -125,9 +124,8 @@ const MediatedRequestsList = ({
columnMapping={MEDIATED_REQUESTS_RECORD_TRANSLATIONS}
contentData={contentData}
totalCount={totalCount}
formatter={mediatedRequestsListFormatter}
formatter={getMediatedRequestsListFormatter(location)}
isEmptyMessage={emptyMessage(source, query)}
onRowClick={onRowClick}
onNeedMoreData={onNeedMoreData}
onHeaderClick={onSort}
sortOrder={sortOrder.replace(/^-/, '').replace(/,.*/, '')}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import {

import {
render,
screen,
} from '@folio/jest-config-stripes/testing-library/react';

import {
Expand All @@ -26,7 +27,7 @@ import MediatedRequestsList, {
DESCENDING,
getSortOrder,
COLUMN_WIDTHS,
mediatedRequestsListFormatter,
getMediatedRequestsListFormatter,
emptyMessage,
} from './MediatedRequestsList';

Expand All @@ -43,6 +44,9 @@ const source = {
const query = {
query: '',
};
const location = {
search: '?filters=requestLevel.Title',
};

jest.mock('react-router-dom', () => ({
...jest.requireActual('react-router-dom'),
Expand Down Expand Up @@ -93,7 +97,6 @@ describe('MediatedRequestsList', () => {
columnMapping: MEDIATED_REQUESTS_RECORD_TRANSLATIONS,
contentData,
totalCount: 0,
formatter: mediatedRequestsListFormatter,
sortOrder: '',
sortDirection: 'ascending',
};
Expand All @@ -102,7 +105,7 @@ describe('MediatedRequestsList', () => {
});
});

describe('mediatedRequestsListFormatter', () => {
describe('getMediatedRequestsListFormatter', () => {
const title = 'title value';
const itemBarcode = 'barcode value';
const requesterBarcode = 'requester barcode value';
Expand All @@ -124,30 +127,33 @@ describe('mediatedRequestsListFormatter', () => {
item,
status,
};
const formatter = getMediatedRequestsListFormatter(location);

describe('title', () => {
it('should return title', () => {
expect(mediatedRequestsListFormatter[MEDIATED_REQUESTS_RECORD_FIELD_NAME.TITLE](mediatedRequest)).toBe(title);
beforeEach(() => {
render(formatter[MEDIATED_REQUESTS_RECORD_FIELD_NAME.TITLE](mediatedRequest));
});

it('should return default value for title', () => {
expect(mediatedRequestsListFormatter[MEDIATED_REQUESTS_RECORD_FIELD_NAME.TITLE]()).toBe(DEFAULT_VIEW_VALUE);
it('should render title', () => {
formatter[MEDIATED_REQUESTS_RECORD_FIELD_NAME.TITLE](mediatedRequest);

expect(screen.getByText(title)).toBeInTheDocument();
});
});

describe('barcode', () => {
it('should return barcode', () => {
expect(mediatedRequestsListFormatter[MEDIATED_REQUESTS_RECORD_FIELD_NAME.ITEM_BARCODE](mediatedRequest)).toBe(itemBarcode);
expect(formatter[MEDIATED_REQUESTS_RECORD_FIELD_NAME.ITEM_BARCODE](mediatedRequest)).toBe(itemBarcode);
});

it('should return default value for barcode', () => {
expect(mediatedRequestsListFormatter[MEDIATED_REQUESTS_RECORD_FIELD_NAME.ITEM_BARCODE]()).toBe(DEFAULT_VIEW_VALUE);
expect(formatter[MEDIATED_REQUESTS_RECORD_FIELD_NAME.ITEM_BARCODE]()).toBe(DEFAULT_VIEW_VALUE);
});
});

describe('mediated request date', () => {
beforeEach(() => {
render(mediatedRequestsListFormatter[MEDIATED_REQUESTS_RECORD_FIELD_NAME.MEDIATED_REQUEST_DATE](mediatedRequest));
render(formatter[MEDIATED_REQUESTS_RECORD_FIELD_NAME.MEDIATED_REQUEST_DATE](mediatedRequest));
});

it('should render app icon with correct props', () => {
Expand All @@ -166,39 +172,39 @@ describe('mediatedRequestsListFormatter', () => {

describe('effective call number', () => {
it('should trigger effective call number with correct argument', () => {
mediatedRequestsListFormatter[MEDIATED_REQUESTS_RECORD_FIELD_NAME.EFFECTIVE_CALL_NUMBER](mediatedRequest);
formatter[MEDIATED_REQUESTS_RECORD_FIELD_NAME.EFFECTIVE_CALL_NUMBER](mediatedRequest);

expect(effectiveCallNumber).toHaveBeenCalledWith(item);
});
});

describe('status', () => {
it('should return status', () => {
expect(mediatedRequestsListFormatter[MEDIATED_REQUESTS_RECORD_FIELD_NAME.STATUS](mediatedRequest)).toBe(status);
expect(formatter[MEDIATED_REQUESTS_RECORD_FIELD_NAME.STATUS](mediatedRequest)).toBe(status);
});

it('should return default value for status', () => {
expect(mediatedRequestsListFormatter[MEDIATED_REQUESTS_RECORD_FIELD_NAME.STATUS]()).toBe(DEFAULT_VIEW_VALUE);
expect(formatter[MEDIATED_REQUESTS_RECORD_FIELD_NAME.STATUS]()).toBe(DEFAULT_VIEW_VALUE);
});
});

describe('requester', () => {
it('should return requester', () => {
expect(mediatedRequestsListFormatter[MEDIATED_REQUESTS_RECORD_FIELD_NAME.REQUESTER](mediatedRequest)).toBe(lastName);
expect(formatter[MEDIATED_REQUESTS_RECORD_FIELD_NAME.REQUESTER](mediatedRequest)).toBe(lastName);
});

it('should return default value for requester', () => {
expect(mediatedRequestsListFormatter[MEDIATED_REQUESTS_RECORD_FIELD_NAME.REQUESTER]()).toBe(DEFAULT_VIEW_VALUE);
expect(formatter[MEDIATED_REQUESTS_RECORD_FIELD_NAME.REQUESTER]()).toBe(DEFAULT_VIEW_VALUE);
});
});

describe('requester barcode', () => {
it('should return requester barcode', () => {
expect(mediatedRequestsListFormatter[MEDIATED_REQUESTS_RECORD_FIELD_NAME.REQUESTER_BARCODE](mediatedRequest)).toBe(requesterBarcode);
expect(formatter[MEDIATED_REQUESTS_RECORD_FIELD_NAME.REQUESTER_BARCODE](mediatedRequest)).toBe(requesterBarcode);
});

it('should return default value for requester barcode', () => {
expect(mediatedRequestsListFormatter[MEDIATED_REQUESTS_RECORD_FIELD_NAME.REQUESTER_BARCODE]()).toBe(DEFAULT_VIEW_VALUE);
expect(formatter[MEDIATED_REQUESTS_RECORD_FIELD_NAME.REQUESTER_BARCODE]()).toBe(DEFAULT_VIEW_VALUE);
});
});
});
Expand Down
1 change: 1 addition & 0 deletions src/constants/mediatedRequestsActivities.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ export const MEDIATED_REQUEST_SEARCH_PARAMS = {
};

export const MEDIATED_REQUESTS_RECORD_FIELD_NAME = {
ID: 'id',
TITLE: 'instanceTitle',
REQUESTER: 'requester',
USER_FIRST_NAME: 'requesterFirstName',
Expand Down
8 changes: 8 additions & 0 deletions test/jest/__mock__/stripesComponents.mock.js
Original file line number Diff line number Diff line change
Expand Up @@ -309,5 +309,13 @@ jest.mock('@folio/stripes/components', () => ({
</div>
);
}),
TextLink: jest.fn(({
to,
children,
}) => (
<a href={to}>
{children}
</a>
)),
MCLPagingTypes: jest.fn(() => ({})),
}));
Loading