Scroll to anchor link

This commit is contained in:
Sebastian Qvarfordt
2020-06-30 14:00:28 +02:00
parent a5e9c224b3
commit 71aa8d9d18
4 changed files with 18 additions and 13 deletions
@@ -25,7 +25,7 @@ import { Header, Content, ItemCard } from '@backstage/core';
import transformer, {
addBaseUrl,
rewriteDocLinks,
addEventListener,
addLinkClickListener,
removeMkdocsHeader,
modifyCss,
} from '../transformers';
@@ -92,8 +92,15 @@ export const Reader = () => {
if (transformedElement) {
divElement.shadowRoot.appendChild(transformedElement);
transformer(divElement.shadowRoot.children[0], [
addEventListener({
onClick: navigate,
addLinkClickListener({
onClick: url => {
const parsedUrl = new URL(url);
navigate(parsedUrl.pathname);
divElement.shadowRoot
?.querySelector(parsedUrl.hash)
?.scrollIntoView();
},
}),
]);
}
@@ -15,14 +15,14 @@
*/
import { createTestShadowDom, FIXTURES } from '../../test-utils';
import { addEventListener } from '../transformers';
import { addLinkClickListener } from '.';
describe('addEventListener', () => {
describe('addLinkClickListener', () => {
it('calls onClick when a link has been clicked', () => {
const fn = jest.fn();
const shadowDom = createTestShadowDom(FIXTURES.FIXTURE_STANDARD_PAGE, {
transformers: [
addEventListener({
addLinkClickListener({
onClick: fn,
}),
],
@@ -16,22 +16,20 @@
import type { Transformer } from './index';
type AddEventListenerOptions = {
type addLinkClickListenerOptions = {
onClick: (newUrl: string) => void;
};
export const addEventListener = ({
export const addLinkClickListener = ({
onClick,
}: AddEventListenerOptions): Transformer => {
}: addLinkClickListenerOptions): Transformer => {
return dom => {
Array.from(dom.getElementsByTagName('a')).forEach(elem => {
elem.addEventListener('click', (e: MouseEvent) => {
e.preventDefault();
const target = e.target as HTMLAnchorElement;
if (target?.getAttribute('href')) {
onClick(
target.getAttribute('href')!.replace(window.location.origin, ''),
);
onClick(target.getAttribute('href')!);
}
});
});
@@ -34,7 +34,7 @@ describe('rewriteDocLinks', () => {
]);
});
it('should transform a href with licalhost as baseUrl', () => {
it('should transform a href with localhost as baseUrl', () => {
const shadowDom = createTestShadowDom(
`
<a href="http://example.org/">Test</a>