Skip to content

Commit a066a87

Browse files
Pollepsjoepio
authored andcommitted
#667 Fix transition title on articles and add folder item view
1 parent 710229b commit a066a87

File tree

6 files changed

+96
-46
lines changed

6 files changed

+96
-46
lines changed
Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,31 @@
1-
import { properties, useString, useTitle } from '@tomic/react';
1+
import { core, useString } from '@tomic/react';
22
import React from 'react';
33
import { styled } from 'styled-components';
44
import { AtomicLink } from '../../components/AtomicLink';
55
import { markdownToPlainText } from '../../helpers/markdown';
6+
import { transitionName } from '../../helpers/transitionName';
7+
import { ViewTransitionProps } from '../../helpers/ViewTransitionProps';
68
import { CardViewProps } from '../Card/CardViewProps';
79

810
export function ArticleCard({ resource }: CardViewProps): JSX.Element {
9-
const [title] = useTitle(resource);
10-
11-
const [description] = useString(resource, properties.description);
11+
const [description] = useString(resource, core.properties.description);
1212
const truncated = markdownToPlainText(description ?? '').slice(0, 200);
1313

1414
return (
1515
<div>
1616
<AtomicLink subject={resource.getSubject()}>
17-
<Title>{title}</Title>
17+
<Title subject={resource.getSubject()}>{resource.title}</Title>
1818
</AtomicLink>
1919
<p>{truncated}...</p>
2020
</div>
2121
);
2222
}
2323

24-
const Title = styled.h2`
24+
const Title = styled.h2<ViewTransitionProps>`
2525
white-space: nowrap;
2626
text-overflow: ellipsis;
2727
width: 100%;
2828
overflow: hidden;
2929
font-size: 1.3rem;
30+
${props => transitionName('page-title', props.subject)}
3031
`;

browser/data-browser/src/views/Card/ResourceCard.tsx

Lines changed: 22 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ import {
44
useString,
55
useResource,
66
useTitle,
7-
properties,
8-
urls,
7+
core,
8+
server,
9+
dataBrowser,
10+
collections,
911
} from '@tomic/react';
1012
import AllProps from '../../components/AllProps';
1113
import { AtomicLink } from '../../components/AtomicLink';
@@ -20,6 +22,9 @@ import { BookmarkCard } from './BookmarkCard.jsx';
2022
import { CardViewProps, CardViewPropsBase } from './CardViewProps';
2123
import { ElementCard } from './ElementCard';
2224
import { ArticleCard } from '../Article';
25+
import { styled } from 'styled-components';
26+
import { ViewTransitionProps } from '../../helpers/ViewTransitionProps';
27+
import { transitionName } from '../../helpers/transitionName';
2328

2429
interface ResourceCardProps extends CardViewPropsBase {
2530
/** The subject URL - the identifier of the resource. */
@@ -73,7 +78,7 @@ function ResourceCardInner(props: ResourceCardProps): JSX.Element {
7378
const { subject } = props;
7479
const resource = useResource(subject);
7580
const [title] = useTitle(resource);
76-
const [klass] = useString(resource, properties.isA);
81+
const [klass] = useString(resource, core.properties.isA);
7782

7883
if (resource.loading) {
7984
return <p>Loading...</p>;
@@ -92,17 +97,17 @@ function ResourceCardInner(props: ResourceCardProps): JSX.Element {
9297

9398
/** Check if there exists a View for this Class. These should be registered in `../views` */
9499
switch (klass) {
95-
case urls.classes.collection:
100+
case collections.classes.collection:
96101
return <CollectionCard resource={resource} {...props} />;
97-
case urls.classes.file:
102+
case server.classes.file:
98103
return <FileCard resource={resource} {...props} />;
99-
case urls.classes.message:
104+
case dataBrowser.classes.message:
100105
return <MessageCard resource={resource} {...props} />;
101-
case urls.classes.bookmark:
106+
case dataBrowser.classes.bookmark:
102107
return <BookmarkCard resource={resource} {...props} />;
103-
case urls.classes.elements.paragraph:
108+
case dataBrowser.classes.paragraph:
104109
return <ElementCard resource={resource} {...props} />;
105-
case urls.classes.article:
110+
case dataBrowser.classes.article:
106111
return <ArticleCard resource={resource} {...props} />;
107112
default:
108113
return <ResourceCardDefault resource={resource} {...props} />;
@@ -113,16 +118,16 @@ export function ResourceCardDefault({
113118
resource,
114119
small,
115120
}: CardViewProps): JSX.Element {
116-
const [title] = useTitle(resource);
117-
118121
return (
119122
<React.Fragment>
120123
<AtomicLink subject={resource.getSubject()}>
121-
<h2>{title}</h2>
124+
<DefaultCardTitle subject={resource.getSubject()}>
125+
{resource.title}
126+
</DefaultCardTitle>
122127
</AtomicLink>
123128
<ValueForm
124129
resource={resource}
125-
propertyURL={urls.properties.description}
130+
propertyURL={core.properties.description}
126131
/>
127132
{!small && (
128133
<AllProps
@@ -137,3 +142,7 @@ export function ResourceCardDefault({
137142
}
138143

139144
export default ResourceCard;
145+
146+
const DefaultCardTitle = styled.h2<ViewTransitionProps>`
147+
${props => transitionName('page-title', props.subject)}
148+
`;
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { Server, useResource, useSubject } from '@tomic/react';
2+
import React from 'react';
3+
import { atomicArgu } from '../../../ontologies/atomic-argu';
4+
import { GridItemViewProps } from './GridItemViewProps';
5+
import { GridItemWithImage } from './GridItemWithImage';
6+
7+
export function ArticleGridItem({ resource }: GridItemViewProps): JSX.Element {
8+
const [coverImgSubject] = useSubject(
9+
resource,
10+
atomicArgu.properties.coverImage,
11+
);
12+
13+
const coverImg = useResource<Server.File>(coverImgSubject);
14+
15+
return <GridItemWithImage src={coverImg.props.downloadUrl} />;
16+
}

browser/data-browser/src/views/FolderPage/GridItem/FileGridItem.tsx

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { TextPreview } from '../../File/TextPreview';
77
import { InnerWrapper } from './components';
88
import { GridItemViewProps } from './GridItemViewProps';
99
import { useFileImageTransitionStyles } from '../../File/useFileImageTransitionStyles';
10+
import { GridItemWithImage } from './GridItemWithImage';
1011

1112
const imageMimeTypes = new Set([
1213
'image/png',
@@ -27,16 +28,7 @@ export function FileGridItem({ resource }: GridItemViewProps): JSX.Element {
2728
}
2829

2930
if (imageMimeTypes.has(mimeType)) {
30-
return (
31-
<InnerWrapper>
32-
<Image
33-
src={downloadUrl}
34-
alt=''
35-
loading='lazy'
36-
style={transitionStyles}
37-
/>
38-
</InnerWrapper>
39-
);
31+
return <GridItemWithImage src={downloadUrl} style={transitionStyles} />;
4032
}
4133

4234
if (isTextFile(mimeType)) {
@@ -46,13 +38,6 @@ export function FileGridItem({ resource }: GridItemViewProps): JSX.Element {
4638
return <TextWrapper>No preview available</TextWrapper>;
4739
}
4840

49-
const Image = styled.img`
50-
width: 100%;
51-
height: 100%;
52-
object-fit: cover;
53-
object-position: center;
54-
`;
55-
5641
const TextWrapper = styled(InnerWrapper)`
5742
display: grid;
5843
place-items: center;
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import React from 'react';
2+
import { styled } from 'styled-components';
3+
import { InnerWrapper } from './components';
4+
5+
interface GridItemWithImageProps {
6+
src: string | undefined;
7+
style?: React.CSSProperties | undefined;
8+
}
9+
10+
export function GridItemWithImage({
11+
src,
12+
style,
13+
}: GridItemWithImageProps): JSX.Element {
14+
if (src === undefined) {
15+
return <TextWrapper>No preview available</TextWrapper>;
16+
}
17+
18+
return (
19+
<InnerWrapper>
20+
<Image src={src} alt='' loading='lazy' style={style} />
21+
</InnerWrapper>
22+
);
23+
}
24+
25+
const Image = styled.img`
26+
width: 100%;
27+
height: 100%;
28+
object-fit: cover;
29+
object-position: center;
30+
`;
31+
32+
const TextWrapper = styled(InnerWrapper)`
33+
display: grid;
34+
place-items: center;
35+
color: ${p => p.theme.colors.textLight};
36+
`;

browser/data-browser/src/views/FolderPage/GridItem/ResourceGridItem.tsx

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {
2-
classes,
3-
properties,
2+
core,
3+
dataBrowser,
4+
server,
45
useResource,
56
useString,
67
useTitle,
@@ -21,18 +22,20 @@ import { FileGridItem } from './FileGridItem';
2122
import { ErrorBoundary } from '../../ErrorPage';
2223
import { useNavigateWithTransition } from '../../../hooks/useNavigateWithTransition';
2324
import { LoaderBlock } from '../../../components/Loader';
25+
import { ArticleGridItem } from './ArticleGridItem';
2426

2527
export interface ResourceGridItemProps {
2628
subject: string;
2729
}
2830

2931
const gridItemMap = new Map<string, React.FC<GridItemViewProps>>([
30-
[classes.bookmark, BookmarkGridItem],
31-
[classes.class, BasicGridItem],
32-
[classes.property, BasicGridItem],
33-
[classes.chatRoom, ChatRoomGridItem],
34-
[classes.document, DocumentGridItem],
35-
[classes.file, FileGridItem],
32+
[dataBrowser.classes.bookmark, BookmarkGridItem],
33+
[core.classes.class, BasicGridItem],
34+
[core.classes.property, BasicGridItem],
35+
[dataBrowser.classes.chatroom, ChatRoomGridItem],
36+
[dataBrowser.classes.document, DocumentGridItem],
37+
[server.classes.file, FileGridItem],
38+
[dataBrowser.classes.article, ArticleGridItem],
3639
]);
3740

3841
function getResourceRenderer(
@@ -48,7 +51,7 @@ export function ResourceGridItem({
4851
const resource = useResource(subject);
4952
const [title] = useTitle(resource);
5053

51-
const [classTypeSubject] = useString(resource, properties.isA);
54+
const [classTypeSubject] = useString(resource, core.properties.isA);
5255
const classType = useResource(classTypeSubject);
5356
const [classTypeName] = useTitle(classType);
5457

@@ -71,7 +74,7 @@ export function ResourceGridItem({
7174
return <Loader />;
7275
}
7376

74-
const isFolder = classTypeSubject === classes.folder;
77+
const isFolder = classTypeSubject === dataBrowser.classes.folder;
7578

7679
const transitionSubject = isFolder ? undefined : subject;
7780

0 commit comments

Comments
 (0)