diff --git a/projects/mercury/src/metadata/common/LinkedDataLink.js b/projects/mercury/src/metadata/common/LinkedDataLink.js
index d012092b1..68758cd03 100644
--- a/projects/mercury/src/metadata/common/LinkedDataLink.js
+++ b/projects/mercury/src/metadata/common/LinkedDataLink.js
@@ -1,28 +1,45 @@
import React, {useContext} from 'react';
-import {Link as RouterLink} from "react-router-dom";
import * as PropTypes from "prop-types";
-import {Link} from '@mui/material';
-import {METADATA_PATH} from "../../constants";
+import {Box, Modal, Tooltip} from '@mui/material';
+import withStyles from '@mui/styles/withStyles';
+import CloseIcon from '@mui/icons-material/Close';
+import LinkedDataEntityPage from "./LinkedDataEntityPage";
import UserContext from '../../users/UserContext';
-
+import styles from './LinkedDataLink.styles';
/**
- * Renders a link to the metadata editor.
- *
- * @param props
- * @constructor
+ * Renders a link to the metadata editor in a modal dialog when clicked.
*/
-const LinkedDataLink = ({uri, children}) => {
+
+const renderModal = (classes, open, handleClose, uri) => (
+
+
+
+
+
+
+
+
+);
+
+const LinkedDataLink = ({classes, uri, children}) => {
+ const [open, setOpen] = React.useState(false);
+ const handleOpen = () => setOpen(true);
+ const handleClose = () => setOpen(false);
+
const {currentUser} = useContext(UserContext);
if (currentUser && currentUser.canViewPublicMetadata) {
return (
-
- {children}
-
+
+
+ {children}
+
+ {renderModal(classes, open, handleClose, uri)}
+
);
}
return children;
@@ -33,4 +50,4 @@ LinkedDataLink.propTypes = {
children: PropTypes.any.isRequired
};
-export default LinkedDataLink;
+export default withStyles(styles)(LinkedDataLink);
diff --git a/projects/mercury/src/metadata/common/LinkedDataLink.styles.js b/projects/mercury/src/metadata/common/LinkedDataLink.styles.js
new file mode 100644
index 000000000..e044c26ee
--- /dev/null
+++ b/projects/mercury/src/metadata/common/LinkedDataLink.styles.js
@@ -0,0 +1,29 @@
+const styles = (theme) => ({
+ modalDialog: {
+ background: theme.palette.grey['200'],
+ position: 'absolute',
+ top: '50%',
+ left: '50%',
+ transform: 'translate(-50%, -50%)',
+ width: 800,
+ bgcolor: 'background.paper',
+ border: '0px solid #000',
+ boxShadow: 0,
+ outline: "none",
+ p: 4,
+ },
+ closeButton: {
+ float: 'right',
+ marginTop: 8,
+ marginRight: 8
+
+ },
+ clickableDiv: {
+ 'cursor': 'pointer',
+ '&:hover': {
+ textDecoration: 'underline'
+ }
+ }
+});
+
+export default styles;
diff --git a/projects/mercury/src/metadata/common/__tests__/LinkedDataLink.js b/projects/mercury/src/metadata/common/__tests__/LinkedDataLink.js
index 758cd7a74..e0675a18d 100644
--- a/projects/mercury/src/metadata/common/__tests__/LinkedDataLink.js
+++ b/projects/mercury/src/metadata/common/__tests__/LinkedDataLink.js
@@ -1,88 +1,59 @@
/* eslint-disable jsx-a11y/anchor-has-content */
import React from 'react';
-import {configure, mount} from "enzyme";
+import {configure} from "enzyme";
import Adapter from "@wojtekmaj/enzyme-adapter-react-17";
-
-import {Router} from 'react-router-dom';
// eslint-disable-next-line import/no-extraneous-dependencies
-import {createMemoryHistory} from 'history';
import LinkedDataLink from "../LinkedDataLink";
-import {METADATA_PATH} from "../../../constants";
+import {fireEvent, render} from "@testing-library/react";
+import theme from "../../../App.theme";
+import {ThemeProvider} from "@mui/material/styles";
import UserContext from '../../../users/UserContext';
// Enzyme is obsolete, the Adapter allows running our old tests.
// For new tests use React Testing Library. Consider migrating enzyme tests when refactoring.
configure({adapter: new Adapter()});
+jest.mock('../LinkedDataEntityPage', () => () => Mocked Metadata Page
);
describe('LinkedDataLink', () => {
- it('should render internal link for any uri', () => {
- const history: History = createMemoryHistory();
- history.push = jest.fn();
-
- const wrapper = mount(
+ it('renders LinkedDataLink without crashing', () => {
+ const { getByText } = render(
-
- Go
-
+
+ Test Content
+
);
-
- expect(wrapper.find('a').isEmpty()).toBeFalsy();
- const anchor = wrapper.find('a').first();
- const expectedLocation = `${METADATA_PATH}?iri=${encodeURIComponent("http://google.nl/some-path?search#hash")}`;
- expect(anchor.prop('href')).toEqual(expectedLocation);
- expect(anchor.text()).toEqual('Go');
- expect(anchor.prop('onClick')).toBeTruthy();
-
- anchor.prop('onClick')(new MouseEvent('click'));
- expect(history.push).toBeCalledTimes(1);
- expect(history.push).toBeCalledWith({
- pathname: METADATA_PATH,
- search: `?iri=${encodeURIComponent("http://google.nl/some-path?search#hash")}`
- });
+ expect(getByText('Test Content')).toBeInTheDocument();
});
- it('should display child elements for users without access to public metadata', () => {
- const history: History = createMemoryHistory();
- history.push = jest.fn();
-
- const wrapper = mount(
-
-
- Go
-
+ it('shows the modal when clicked', () => {
+ const { getByText, queryByText } = render(
+
+
+ Test Content
+
);
+ expect(queryByText('Mocked Metadata Page')).not.toBeInTheDocument();
- expect(wrapper.find('a').isEmpty()).toBeTruthy();
- expect(wrapper.text()).toEqual('Go');
+ fireEvent.click(getByText('Test Content'));
+ expect(getByText('Mocked Metadata Page')).toBeInTheDocument();
});
- it('should not break on an invalid url (return children only)', () => {
- const uri = `some-invalid-url`;
- const history: History = createMemoryHistory();
- history.push = jest.fn();
-
- const wrapper = mount(
+ it('closes the modal when close icon is clicked', () => {
+ const { getByText, getByTestId, queryByText } = render(
-
- something
-
+
+ Test Content
+
);
- expect(wrapper.find('a').isEmpty()).toBeFalsy();
- const anchor = wrapper.find('a').first();
- const expectedLocation = `${METADATA_PATH}?iri=${encodeURIComponent(uri)}`;
- expect(anchor.prop('href')).toEqual(expectedLocation);
- expect(anchor.text()).toEqual('something');
- expect(anchor.prop('onClick')).toBeTruthy();
+ fireEvent.click(getByText('Test Content'));
+ expect(getByText('Mocked Metadata Page')).toBeInTheDocument();
- anchor.prop('onClick')(new MouseEvent('click'));
- expect(history.push).toBeCalledTimes(1);
- expect(history.push).toBeCalledWith({
- pathname: METADATA_PATH,
- search: `?iri=${encodeURIComponent(uri)}`
- });
+ const close = getByTestId('CloseIcon');
+ fireEvent.click(close);
+ expect(queryByText('Mocked Metadata Page')).not.toBeInTheDocument();
});
});