in newswires/client/src/WireDetail.tsx [71:149]
function CategoryCodeTable({ categoryCodes }: { categoryCodes: string[] }) {
const { handleEnterQuery, config } = useSearch();
const isCodeInSearch = (code: string) => {
const categoryCodesInSearch = config.query.categoryCode ?? [];
return categoryCodesInSearch.includes(code);
};
const categoryCodeTableItems: CategoryCodeTableItem[] = categoryCodes.map(
(code) => ({
code: code,
labels: lookupCatCodesWideSearch(code).join('; '),
isSelected: isCodeInSearch(code),
}),
);
const handleCategoryClick = (categoryCode: string) => {
const codes = config.query.categoryCode ?? [];
handleEnterQuery({
...config.query,
categoryCode: codes.includes(categoryCode)
? codes.filter((s) => s !== categoryCode)
: [...codes, categoryCode],
});
};
const columns: Array<EuiBasicTableColumn<CategoryCodeTableItem>> = [
{
field: 'code',
name: 'Category code',
},
{
field: 'labels',
name: 'Category label(s)*',
},
{
field: 'isSelected',
name: 'Filter by?',
align: 'right',
render: (isSelected, item) => (
<EuiButtonIcon
color={isSelected ? 'primary' : 'accent'}
onClick={() => handleCategoryClick(item.code)}
iconType={isSelected ? 'check' : 'plusInCircle'}
aria-label="Toggle selection"
/>
),
},
];
return (
<Disclosure title={`Category Codes (${categoryCodeTableItems.length})`}>
{categoryCodeTableItems.length === 0 ? (
'No category code information available'
) : (
<figure>
<EuiBasicTable
items={categoryCodeTableItems}
columns={columns}
tableLayout="auto"
/>
<EuiSpacer size={'s'} />
<figcaption>
<EuiText size={'xs'}>
<p>
Category codes associated with this item. Many of these are
agency-specific.
</p>
<p>
* nb. Category labels are a best approximation, please let us
know if you spot any that don't look right!
</p>
</EuiText>
</figcaption>
</figure>
)}
</Disclosure>
);
}