Skip to content

Commit 0b38e53

Browse files
Pollepsjoepio
authored andcommitted
#39 Add test and better styling
1 parent 4966a09 commit 0b38e53

File tree

3 files changed

+79
-21
lines changed

3 files changed

+79
-21
lines changed

data-browser/src/routes/History/HistoryRoute.tsx

Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useMemo, useState } from 'react';
1+
import React, { useEffect, useId, useMemo, useState } from 'react';
22
import { useResource, useStore, Version } from '@tomic/react';
33

44
import { ContainerNarrow } from '../../components/Containers';
@@ -18,21 +18,37 @@ import {
1818
groupVersionsByMonth,
1919
setResourceToVersion,
2020
} from './versionHelpers';
21+
import { toast } from 'react-hot-toast';
22+
import { useNavigateWithTransition } from '../../hooks/useNavigateWithTransition';
23+
import { constructOpenURL } from '../../helpers/navigation';
2124

2225
/** Shows an activity log of previous versions */
2326
export function History(): JSX.Element {
2427
const store = useStore();
28+
const navigate = useNavigateWithTransition();
29+
const scrollerTitleId = useId();
30+
2531
const [subject] = useCurrentSubject();
2632
const resource = useResource(subject);
2733
const { versions, loading, error } = useVersions(resource);
28-
const [selectedVersion, setSelectedVersion] = useState<Version | undefined>(
29-
versions[versions.length - 1],
30-
);
34+
const [selectedVersion, setSelectedVersion] = useState<Version | undefined>();
3135

3236
const groupedVersions: {
3337
[key: string]: Version[];
3438
} = useMemo(() => groupVersionsByMonth(dedupeVersions(versions)), [versions]);
3539

40+
useEffect(() => {
41+
setSelectedVersion(versions[versions.length - 1]);
42+
}, [versions]);
43+
44+
const setResourceToCurrentVersion = async () => {
45+
if (selectedVersion && subject) {
46+
await setResourceToVersion(resource, selectedVersion, store);
47+
toast.success('Resource version updated');
48+
navigate(constructOpenURL(subject));
49+
}
50+
};
51+
3652
if (loading) {
3753
return <ContainerNarrow>Loading history of {subject}...</ContainerNarrow>;
3854
}
@@ -48,28 +64,24 @@ export function History(): JSX.Element {
4864
return (
4965
<SplitView about={subject}>
5066
<CurrentItem>
51-
<Column>
67+
<Column fullHeight>
5268
<Title resource={resource} prefix='History of' link />
5369
{selectedVersion && selectedVersion?.resource && (
5470
<>
5571
<VersionTitle version={selectedVersion} />
56-
<Card>
72+
<StyledCard>
5773
<ResourceCardDefault resource={selectedVersion.resource} />
58-
</Card>
59-
<Button
60-
onClick={() =>
61-
setResourceToVersion(resource, selectedVersion, store)
62-
}
63-
>
74+
</StyledCard>
75+
<Button onClick={setResourceToCurrentVersion}>
6476
Make current version
6577
</Button>
6678
</>
6779
)}
6880
</Column>
6981
</CurrentItem>
70-
<Scroller>
82+
<ScrollerSection aria-labelledby={scrollerTitleId}>
7183
<Column>
72-
<h2>Versions</h2>
84+
<ScrollerTitle id={scrollerTitleId}>Versions</ScrollerTitle>
7385
{Object.entries(groupedVersions).map(([key, group]) => (
7486
<React.Fragment key={key}>
7587
<GroupHeading>{key}</GroupHeading>
@@ -84,30 +96,38 @@ export function History(): JSX.Element {
8496
</React.Fragment>
8597
))}
8698
</Column>
87-
</Scroller>
99+
</ScrollerSection>
88100
</SplitView>
89101
);
90102
}
91103

92-
const SplitView = styled.div`
104+
const SplitView = styled.main`
93105
display: flex;
94106
/* Fills entire view on all devices */
95107
width: 100%;
96108
height: 100%;
97-
height: calc(100vh - 4rem);
109+
height: calc(100vh - 5rem);
110+
padding: ${p => p.theme.margin}rem;
111+
gap: ${p => p.theme.margin}rem;
112+
`;
113+
114+
const StyledCard = styled(Card)`
115+
flex: 1;
116+
overflow: auto;
98117
`;
99118

100119
const CurrentItem = styled.div`
101120
flex: 1;
102-
padding: 1rem;
103121
`;
104122

105-
const Scroller = styled.div`
123+
const ScrollerTitle = styled.h2`
124+
text-align: center;
125+
`;
126+
const ScrollerSection = styled.section`
106127
overflow: auto;
107128
/* flex: 1; */
108129
border: 1px solid ${p => p.theme.colors.bg2};
109130
border-radius: ${p => p.theme.radius};
110-
margin: 1rem;
111131
background-color: ${p => p.theme.colors.bg};
112132
padding: 1rem;
113133
width: 20rem;

data-browser/src/routes/History/VersionButton.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export function VersionButton({
2121
key={version.commit.signature}
2222
onClick={onClick}
2323
about={version.commit.id}
24+
data-testid='version-button'
2425
>
2526
<DateTime date={new Date(version.commit.createdAt)} />
2627
</VersionRow>

data-browser/tests/e2e.spec.ts

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,38 @@ test.describe('data-browser', async () => {
620620
),
621621
);
622622
});
623+
624+
test('history page', async ({ page }) => {
625+
await signIn(page);
626+
await newDrive(page);
627+
// Create new class from new resource menu
628+
await newResource('document', page);
629+
630+
// commit for saving initial document
631+
await page.waitForResponse(`${serverUrl}/commit`);
632+
// commit for initializing the first element (paragraph)
633+
await page.waitForResponse(`${serverUrl}/commit`);
634+
635+
await editTitle('First Title', page);
636+
expect(page.locator('text=First Title')).toBeVisible();
637+
638+
await editTitle('Second Title', page, true);
639+
expect(page.locator('text=Second Title')).toBeVisible();
640+
641+
await contextMenuClick('history', page);
642+
expect(page.locator('text=History of Second Title')).toBeVisible();
643+
644+
await page.getByTestId('version-button').nth(1).click();
645+
646+
expect(page.locator('text=First Title')).toBeVisible();
647+
648+
await page.click('text=Make current version');
649+
650+
expect(page.locator('text=Resource version updated')).toBeVisible();
651+
await page.waitForNavigation();
652+
expect(page.locator('h1:has-text("First Title")')).toBeVisible();
653+
expect(page.locator('text=History of First Title')).not.toBeVisible();
654+
});
623655
});
624656

625657
async function disableViewTransition(page: Page) {
@@ -743,8 +775,13 @@ async function changeDrive(subject: string, page: Page) {
743775
await expect(page.locator('text=Create new resource')).toBeVisible();
744776
}
745777

746-
async function editTitle(title: string, page: Page) {
778+
async function editTitle(title: string, page: Page, clear = false) {
747779
await page.locator(editableTitle).click();
780+
781+
if (clear) {
782+
await page.locator(editableTitle).clear();
783+
}
784+
748785
// These keys make sure the onChange handler is properly called
749786
await page.keyboard.press('Space');
750787
await page.keyboard.press('Backspace');

0 commit comments

Comments
 (0)