Skip to content

Commit

Permalink
feat: collection card and dataset cards ready
Browse files Browse the repository at this point in the history
  • Loading branch information
g-saracca committed Sep 20, 2024
1 parent 4034cc7 commit e89df02
Show file tree
Hide file tree
Showing 39 changed files with 809 additions and 195 deletions.
6 changes: 3 additions & 3 deletions src/collection/domain/models/CollectionItemSubset.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { CollectionItemTypePreview } from './CollectionItemTypePreview'
import { DatasetPreview } from '../../../dataset/domain/models/DatasetPreview'
import { FilePreview } from '../../../files/domain/models/FilePreview'
import { CollectionPreview } from './CollectionPreview'
import { FileItemTypePreview } from './FileItemTypePreview'

export interface CollectionItemSubset {
items: CollectionItem[]
totalItemCount: number
}

export type CollectionItem = CollectionPreview | DatasetPreview | FilePreview
export type CollectionItem = CollectionItemTypePreview | DatasetPreview | FileItemTypePreview
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { CollectionItemType } from './CollectionItemType'

export interface CollectionPreview {
export interface CollectionItemTypePreview {
type: CollectionItemType.COLLECTION
isReleased: boolean
name: string
Expand Down
29 changes: 29 additions & 0 deletions src/collection/domain/models/FileItemTypePreview.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { PublicationStatus } from '../../../shared/core/domain/models/PublicationStatus'
import { CollectionItemType } from './CollectionItemType'

export interface FileItemTypePreview {
type: CollectionItemType.FILE
id: number
name: string
persistentId?: string
url: string
imageUrl?: string
description: string
fileType: string
fileContentType: string
sizeInBytes: number
md5?: string
checksum?: FilePreviewChecksum
unf: string
datasetName: string
datasetId: number
datasetPersistentId: string
datasetCitation: string
publicationStatuses: PublicationStatus[]
releaseOrCreateDate: Date
}

export interface FilePreviewChecksum {
type: string
value: string
}
54 changes: 54 additions & 0 deletions src/collection/infrastructure/mappers/JSCollectionItemsMapper.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
import {
CollectionPreview as JSCollectionPreview,
DatasetPreview as JSDatasetPreview,
FilePreview as JSFilePreview,
CollectionItemType as JSCollectionItemType
} from '@iqss/dataverse-client-javascript'
import { CollectionItemTypePreview } from '../../domain/models/CollectionItemTypePreview'
import { PublicationStatus } from '../../../shared/core/domain/models/PublicationStatus'
import { CollectionItem } from '../../domain/models/CollectionItemSubset'
import { JSDatasetPreviewMapper } from '../../../dataset/infrastructure/mappers/JSDatasetPreviewMapper'
import { JSFileItemTypePreviewMapper } from './JSFileItemTypePreviewMapper'

export class JSCollectionItemsMapper {
static toCollectionItemsPreviews(
jsCollectionItems: (JSCollectionPreview | JSDatasetPreview | JSFilePreview)[]
): CollectionItem[] {
const items: CollectionItem[] = []

jsCollectionItems.forEach((item: JSCollectionPreview | JSDatasetPreview | JSFilePreview) => {
if (item.type === JSCollectionItemType.FILE) {
// TODO:ME Here we should like make all the necessary extra calls to get info for satisfied FilePreview model??
items.push(JSFileItemTypePreviewMapper.toFileItemTypePreview(item))
} else if (item.type === JSCollectionItemType.DATASET) {
items.push(JSDatasetPreviewMapper.toDatasetPreview(item))
} else if (item.type === JSCollectionItemType.COLLECTION) {
items.push(this.toCollectionItemTypePreview(item))
}
})
return items
}

static toCollectionItemTypePreview(
jsDatasetPreview: JSCollectionPreview
): CollectionItemTypePreview {
return {
type: jsDatasetPreview.type,
isReleased: JSCollectionItemsMapper.toIsRelasedCollection(
jsDatasetPreview.publicationStatuses
),
name: jsDatasetPreview.name,
alias: jsDatasetPreview.alias,
description: jsDatasetPreview.description,
affiliation: jsDatasetPreview.affiliation,
releaseOrCreateDate: jsDatasetPreview.releaseOrCreateDate,
thumbnail: jsDatasetPreview.imageUrl,
parentCollectionName: jsDatasetPreview.parentName,
parentCollectionAlias: jsDatasetPreview.parentAlias
}
}

static toIsRelasedCollection(jsPublicationStatus: PublicationStatus[]): boolean {
return jsPublicationStatus.includes(PublicationStatus.Published)
}
}
24 changes: 0 additions & 24 deletions src/collection/infrastructure/mappers/JSCollectionPreviewMapper.ts

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { FilePreview as JSFilePreview } from '@iqss/dataverse-client-javascript'
import { FileItemTypePreview } from '../../domain/models/FileItemTypePreview'

export class JSFileItemTypePreviewMapper {
static toFileItemTypePreview(jsFilePreview: JSFilePreview): FileItemTypePreview {
return {
type: jsFilePreview.type,
id: jsFilePreview.fileId,
name: jsFilePreview.name,
persistentId: jsFilePreview.filePersistentId,
url: jsFilePreview.url,
imageUrl: jsFilePreview.imageUrl,
description: jsFilePreview.description,
fileType: jsFilePreview.fileType,
fileContentType: jsFilePreview.fileContentType,
sizeInBytes: jsFilePreview.sizeInBytes,
md5: jsFilePreview.md5,
checksum: jsFilePreview.checksum,
unf: jsFilePreview.unf,
datasetName: jsFilePreview.datasetName,
datasetId: jsFilePreview.datasetId,
datasetPersistentId: jsFilePreview.datasetPersistentId,
datasetCitation: jsFilePreview.datasetCitation,
publicationStatuses: jsFilePreview.publicationStatuses,
releaseOrCreateDate: jsFilePreview.releaseOrCreateDate
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,13 @@ import {
getCollectionItems
} from '@iqss/dataverse-client-javascript'
import { JSCollectionMapper } from '../mappers/JSCollectionMapper'
import { JSCollectionPreviewMapper } from '../mappers/JSCollectionPreviewMapper'
import { CollectionDTO } from '../../domain/useCases/DTOs/CollectionDTO'
import { CollectionFacet } from '../../domain/models/CollectionFacet'
import { CollectionUserPermissions } from '../../domain/models/CollectionUserPermissions'
import { CollectionItemsPaginationInfo } from '../../domain/models/CollectionItemsPaginationInfo'
import { CollectionItemSubset } from '../../domain/models/CollectionItemSubset'
import { CollectionSearchCriteria } from '../../domain/models/CollectionSearchCriteria'
import { CollectionItemType } from '../../domain/models/CollectionItemType'
import { JSCollectionItemsMapper } from '../mappers/JSCollectionItemsMapper'

export class CollectionJSDataverseRepository implements CollectionRepository {
getById(id: string): Promise<Collection> {
Expand All @@ -40,7 +39,6 @@ export class CollectionJSDataverseRepository implements CollectionRepository {
.then((jsCollectionUserPermissions) => jsCollectionUserPermissions)
}

// TODO:ME After updating previews object to match the response models we should not see ts error anymore under the return keyword
getItems(
collectionId: string,
paginationInfo: CollectionItemsPaginationInfo,
Expand All @@ -49,17 +47,12 @@ export class CollectionJSDataverseRepository implements CollectionRepository {
return getCollectionItems
.execute(collectionId, paginationInfo?.pageSize, paginationInfo?.offset, searchCriteria)
.then((jsCollectionItemSubset) => {
const collectionPreviewsMapped = jsCollectionItemSubset.items
.filter((item) => item.type === CollectionItemType.COLLECTION)
.map((item) => JSCollectionPreviewMapper.toCollectionPreview(item))

// TODO:ME This will change, I need a mapper for all types
const jsCollectionItemsWithoutCollections = jsCollectionItemSubset.items.filter(
(item) => item.type !== CollectionItemType.COLLECTION
const collectionItemsPreviewsMapped = JSCollectionItemsMapper.toCollectionItemsPreviews(
jsCollectionItemSubset.items
)

return {
items: [...jsCollectionItemsWithoutCollections, ...collectionPreviewsMapped],
items: collectionItemsPreviewsMapped,
totalItemCount: jsCollectionItemSubset.totalItemCount
}
})
Expand Down
17 changes: 16 additions & 1 deletion src/dataset/domain/models/DatasetPreview.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,22 @@
import { CollectionItemType } from '../../../collection/domain/models/CollectionItemType'
import { PublicationStatus } from '../../../shared/core/domain/models/PublicationStatus'
import { DatasetVersion } from './Dataset'

// TODO:ME Once 181 is merged, update interface
// TODO:ME A class is not needed, we can change to an interface, we can ellipse the text with CSS as done in CollectionCard and FileCard

export interface DatasetPreview {
type: CollectionItemType.DATASET
persistentId: string
version: DatasetVersion
releaseOrCreateDate: Date
description: string
thumbnail?: string
publicationStatuses: PublicationStatus[]
parentCollectionName: string
parentCollectionAlias: string
}

/*
export class DatasetPreview {
constructor(
public persistentId: string,
Expand All @@ -19,3 +33,4 @@ export class DatasetPreview {
return this.description
}
}
*/
18 changes: 11 additions & 7 deletions src/dataset/infrastructure/mappers/JSDatasetPreviewMapper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,18 +5,22 @@ import { JSDatasetVersionMapper } from './JSDatasetVersionMapper'

export class JSDatasetPreviewMapper {
static toDatasetPreview(jsDatasetPreview: JSDatasetPreview): DatasetPreview {
return new DatasetPreview(
jsDatasetPreview.persistentId,
JSDatasetVersionMapper.toVersion(
return {
type: jsDatasetPreview.type,
persistentId: jsDatasetPreview.persistentId,
version: JSDatasetVersionMapper.toVersion(
jsDatasetPreview.versionId,
jsDatasetPreview.versionInfo,
jsDatasetPreview.title,
jsDatasetPreview.citation
),
JSDatasetPreviewMapper.toPreviewDate(jsDatasetPreview.versionInfo),
jsDatasetPreview.description,
undefined // TODO: get dataset thumbnail from Dataverse https://github.com/IQSS/dataverse-frontend/issues/203
)
releaseOrCreateDate: JSDatasetPreviewMapper.toPreviewDate(jsDatasetPreview.versionInfo),
description: jsDatasetPreview.description,
thumbnail: undefined, // TODO: get dataset thumbnail from Dataverse https://github.com/IQSS/dataverse-frontend/issues/203
publicationStatuses: jsDatasetPreview.publicationStatuses,
parentCollectionName: jsDatasetPreview.parentCollectionName,
parentCollectionAlias: jsDatasetPreview.parentCollectionAlias
}
}

static toPreviewDate(jsVersionInfo: JSDatasetVersionInfo): Date {
Expand Down
2 changes: 0 additions & 2 deletions src/files/domain/models/FilePreview.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@ import {
} from '../../../dataset/domain/models/Dataset'
import { FilePermissions } from './FilePermissions'

// TODO:ME Once 181 is merged, update interface

export interface FilePreview {
id: number
name: string
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@
flex-direction: column;
gap: 0.75rem;
margin: 0;
padding: 0.5rem 0;
padding: 1rem 0;

li {
list-style: none;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@ import { ErrorItemsMessage } from './ErrorItemsMessage'
import { NoItemsMessage } from './NoItemsMessage'
import { NoSearchMatchesMessage } from './NoSearchMatchesMessage'
import { NO_COLLECTION_ITEMS } from '../useGetAccumulatedItems'
import styles from './ItemsList.module.scss'
import { CollectionItemType } from '../../../../collection/domain/models/CollectionItemType'
import { CollectionCard } from '../../datasets-list/collection-card/CollectionCard'
import { CollectionCard } from './collection-card/CollectionCard'
import { DatasetCard } from './dataset-card/DatasetCard'
// import { FileCard } from './file-card/FileCard'
import styles from './ItemsList.module.scss'

interface ItemsListProps {
items: CollectionItem[]
Expand Down Expand Up @@ -56,6 +58,8 @@ export const ItemsList = forwardRef(
const showSentrySkeleton = hasNextPage && !error && !isEmptyItems
const showNotSentrySkeleton = isLoadingItems && isEmptyItems

// TODO:ME When search is too fast, switching from no results to loading skeleton to results gives a flicker effect

return (
<section ref={rootRef}>
<div
Expand Down Expand Up @@ -83,40 +87,23 @@ export const ItemsList = forwardRef(
)}
</header>

{/* TODO:ME After updating js-dataverse use case, assert by the type wich card to render */}
<ul>
{items.map((collectionItem, index) => {
// console.log(collectionItem)
// if (collectionItem?.type === CollectionItemType.COLLECTION) {
// return (
// <li
// style={{ height: 100, border: 'solid 2px black' }}
// key={index}
// // key={`${dataset.persistentId}-${dataset.version.id}`}
// >
// <p>This is a Collection</p>
// </li>
// )
// }
// TODO:ME make unique keys specially for datasets and files also maybe?

return (
<li
key={index}
// key={`${dataset.persistentId}-${dataset.version.id}`}
>
<li key={`${collectionItem.type}-${index}`}>
{collectionItem?.type === CollectionItemType.COLLECTION && (
<CollectionCard collectionPreview={collectionItem} />
)}
{collectionItem?.type === CollectionItemType.DATASET && (
<p>This is a Dataset</p>
<DatasetCard datasetPreview={collectionItem} />
)}

{collectionItem?.type === CollectionItemType.FILE && (
<p style={{ border: 'solid 1px red', margin: 0 }}>Here goes a File Card</p>
// <FileCard filePreview={collectionItem as FileItemTypePreview} />
)}
{collectionItem?.type === CollectionItemType.FILE && <p>This is a File</p>}
{/* <p>
This is a : {collectionItem?.type === 'file' && 'File'}
{collectionItem?.type === 'dataset' && 'Dataset'}
{collectionItem?.type === 'collection' && 'Collection'}
</p> */}
</li>
)
})}
Expand Down
Loading

0 comments on commit e89df02

Please sign in to comment.