2020-08-05 14:56:02 +02:00
|
|
|
import React from 'react';
|
|
|
|
|
import PropTypes from 'prop-types';
|
2023-03-22 22:45:28 +01:00
|
|
|
import Typography from '../Typography';
|
|
|
|
|
import Icon from '../Icon';
|
2020-08-05 14:56:02 +02:00
|
|
|
|
2023-03-22 22:45:28 +01:00
|
|
|
const ContextMenu = ({ items, ...props }) => {
|
|
|
|
|
if (!items) {
|
|
|
|
|
console.warn('No items for context menu');
|
|
|
|
|
return null;
|
|
|
|
|
}
|
2020-08-05 14:56:02 +02:00
|
|
|
return (
|
|
|
|
|
<div
|
2023-03-22 22:45:28 +01:00
|
|
|
data-cy="context-menu"
|
2020-08-05 14:56:02 +02:00
|
|
|
className="relative bg-secondary-dark rounded z-50 block w-48"
|
|
|
|
|
onContextMenu={e => e.preventDefault()}
|
|
|
|
|
>
|
|
|
|
|
{items.map((item, index) => (
|
|
|
|
|
<div
|
|
|
|
|
key={index}
|
2023-03-22 22:45:28 +01:00
|
|
|
data-cy="context-menu-item"
|
|
|
|
|
onClick={() => item.action(item, props)}
|
2020-08-05 14:56:02 +02:00
|
|
|
className="flex px-4 py-3 cursor-pointer items-center transition duration-300 hover:bg-primary-dark border-b border-primary-dark last:border-b-0"
|
|
|
|
|
>
|
2023-03-22 22:45:28 +01:00
|
|
|
<Typography>
|
|
|
|
|
{item.label}
|
|
|
|
|
{item.iconRight && (
|
|
|
|
|
<Icon name={item.iconRight} className="inline" />
|
|
|
|
|
)}
|
|
|
|
|
</Typography>
|
2020-08-05 14:56:02 +02:00
|
|
|
</div>
|
|
|
|
|
))}
|
|
|
|
|
</div>
|
|
|
|
|
);
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
ContextMenu.propTypes = {
|
|
|
|
|
items: PropTypes.arrayOf(
|
|
|
|
|
PropTypes.shape({
|
|
|
|
|
label: PropTypes.string.isRequired,
|
|
|
|
|
action: PropTypes.func.isRequired,
|
|
|
|
|
})
|
|
|
|
|
).isRequired,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
export default ContextMenu;
|