diff --git a/src/files/domain/models/FileItemTypePreview.ts b/src/files/domain/models/FileItemTypePreview.ts index 881dab1a7..1bb2fa037 100644 --- a/src/files/domain/models/FileItemTypePreview.ts +++ b/src/files/domain/models/FileItemTypePreview.ts @@ -1,5 +1,6 @@ import { CollectionItemType } from '../../../collection/domain/models/CollectionItemType' import { PublicationStatus } from '../../../shared/core/domain/models/PublicationStatus' +import { FileLabel } from './FileMetadata' export interface FileItemTypePreview { type: CollectionItemType.FILE @@ -21,6 +22,9 @@ export interface FileItemTypePreview { datasetCitation: string publicationStatuses: PublicationStatus[] releaseOrCreateDate: Date + variables?: number + observations?: number + tags?: FileLabel[] restricted: boolean canDownloadFile: boolean } diff --git a/src/files/domain/models/FileMetadata.ts b/src/files/domain/models/FileMetadata.ts index 1d4629e6d..5e656b433 100644 --- a/src/files/domain/models/FileMetadata.ts +++ b/src/files/domain/models/FileMetadata.ts @@ -99,8 +99,8 @@ export class FileEmbargo { } export interface FileTabularData { - variablesCount: number - observationsCount: number + variables: number + observations: number unf?: string } diff --git a/src/files/infrastructure/mappers/JSFileItemTypePreviewMapper.ts b/src/files/infrastructure/mappers/JSFileItemTypePreviewMapper.ts index af31af661..2804d1c5d 100644 --- a/src/files/infrastructure/mappers/JSFileItemTypePreviewMapper.ts +++ b/src/files/infrastructure/mappers/JSFileItemTypePreviewMapper.ts @@ -1,8 +1,20 @@ import { FilePreview as JSFilePreview } from '@iqss/dataverse-client-javascript' import { FileItemTypePreview } from '../../domain/models/FileItemTypePreview' +import { FileLabelType } from '@/files/domain/models/FileMetadata' +import { FileLabel } from '@/files/domain/models/FileMetadata' export class JSFileItemTypePreviewMapper { static toFileItemTypePreview(jsFilePreview: JSFilePreview): FileItemTypePreview { + const tabularTagsAsLabels: FileLabel[] = (jsFilePreview.tabularTags || []).map((tag) => ({ + type: FileLabelType.TAG, + value: tag + })) + + const categoriesAsLabels: FileLabel[] = (jsFilePreview.categories || []).map((category) => ({ + type: FileLabelType.CATEGORY, + value: category + })) + return { type: jsFilePreview.type, id: jsFilePreview.fileId, @@ -23,6 +35,9 @@ export class JSFileItemTypePreviewMapper { datasetCitation: jsFilePreview.datasetCitation, publicationStatuses: jsFilePreview.publicationStatuses, releaseOrCreateDate: jsFilePreview.releaseOrCreateDate, + tags: [...categoriesAsLabels, ...tabularTagsAsLabels] as FileLabel[], + variables: jsFilePreview.variables, + observations: jsFilePreview.observations, restricted: jsFilePreview.restricted, canDownloadFile: jsFilePreview.canDownloadFile } diff --git a/src/files/infrastructure/mappers/JSFileMetadataMapper.ts b/src/files/infrastructure/mappers/JSFileMetadataMapper.ts index 5d4557824..e08f4bf19 100644 --- a/src/files/infrastructure/mappers/JSFileMetadataMapper.ts +++ b/src/files/infrastructure/mappers/JSFileMetadataMapper.ts @@ -124,8 +124,8 @@ export class JSFileMetadataMapper { static toFileTabularData(jsTabularData: JSFileTabularData[]): FileTabularData { return { - variablesCount: jsTabularData[0].varQuantity ?? 0, - observationsCount: jsTabularData[0].caseQuantity ?? 0, + variables: jsTabularData[0].varQuantity ?? 0, + observations: jsTabularData[0].caseQuantity ?? 0, unf: jsTabularData[0].UNF } } diff --git a/src/sections/collection/collection-items-panel/items-list/file-card/FileCardInfo.tsx b/src/sections/collection/collection-items-panel/items-list/file-card/FileCardInfo.tsx index 977212bb6..ea4c5da66 100644 --- a/src/sections/collection/collection-items-panel/items-list/file-card/FileCardInfo.tsx +++ b/src/sections/collection/collection-items-panel/items-list/file-card/FileCardInfo.tsx @@ -6,6 +6,7 @@ import { FileCardHelper } from './FileCardHelper' import { Route } from '@/sections/Route.enum' import { DvObjectType } from '@/shared/hierarchy/domain/models/UpwardHierarchyNode' import { LinkToPage } from '@/sections/shared/link-to-page/LinkToPage' +import { FileLabels } from '@/sections/file/file-labels/FileLabels' import { CopyToClipboardButton } from '@/sections/dataset/dataset-files/files-table/file-info/file-info-cell/file-info-data/copy-to-clipboard-button/CopyToClipboardButton' import styles from './FileCard.module.scss' @@ -15,6 +16,8 @@ interface FileCardInfoProps { export function FileCardInfo({ filePreview }: FileCardInfoProps) { const bytesFormatted = FileCardHelper.formatBytesToCompactNumber(filePreview.sizeInBytes) + const variables = filePreview.variables || 0 + const observations = filePreview.observations || 0 return (
@@ -39,6 +42,9 @@ export function FileCardInfo({ filePreview }: FileCardInfoProps) {
{filePreview.fileType} {`- ${bytesFormatted}`} + {filePreview.fileType === 'Tab-Delimited' && ( + {`- ${variables} variables, ${observations} observations`} + )} {filePreview.checksum && ( {`- ${filePreview.checksum.type}:`} @@ -46,7 +52,10 @@ export function FileCardInfo({ filePreview }: FileCardInfoProps) { )}
-

{filePreview.description}

+
+ +
+ {filePreview.description &&

{filePreview.description}

}
) diff --git a/src/sections/dataset/dataset-files/files-table/file-info/file-info-cell/file-info-data/FileTabularData.tsx b/src/sections/dataset/dataset-files/files-table/file-info/file-info-cell/file-info-data/FileTabularData.tsx index 19e854db7..a59ea82c5 100644 --- a/src/sections/dataset/dataset-files/files-table/file-info/file-info-cell/file-info-data/FileTabularData.tsx +++ b/src/sections/dataset/dataset-files/files-table/file-info/file-info-cell/file-info-data/FileTabularData.tsx @@ -13,8 +13,8 @@ export function FileTabularData({ } return (
- {tabularData.variablesCount} {t('table.tabularData.variables')},{' '} - {tabularData.observationsCount} {t('table.tabularData.observations')}{' '} + {tabularData.variables} {t('table.tabularData.variables')}, {tabularData.observations}{' '} + {t('table.tabularData.observations')}{' '} {tabularData.unf && }
) diff --git a/src/sections/file/file-labels/FileLabels.module.scss b/src/sections/file/file-labels/FileLabels.module.scss index 0fe9630bf..e21db111a 100644 --- a/src/sections/file/file-labels/FileLabels.module.scss +++ b/src/sections/file/file-labels/FileLabels.module.scss @@ -1,3 +1,4 @@ .container > * { margin-right: 0.5em; + font-size: 12px; } diff --git a/src/sections/file/file-metadata/FileMetadata.tsx b/src/sections/file/file-metadata/FileMetadata.tsx index 1c95782f8..935d1fdf7 100644 --- a/src/sections/file/file-metadata/FileMetadata.tsx +++ b/src/sections/file/file-metadata/FileMetadata.tsx @@ -157,13 +157,13 @@ export function FileMetadata({ {t('metadata.fields.variables')} - {metadata.tabularData.variablesCount} + {metadata.tabularData.variables} {t('metadata.fields.observations')} - {metadata.tabularData.observationsCount} + {metadata.tabularData.observations} )} diff --git a/tests/component/files/domain/models/FileItemTypePreviewMother.ts b/tests/component/files/domain/models/FileItemTypePreviewMother.ts index f61b34124..ed306b9cb 100644 --- a/tests/component/files/domain/models/FileItemTypePreviewMother.ts +++ b/tests/component/files/domain/models/FileItemTypePreviewMother.ts @@ -2,7 +2,9 @@ import { faker } from '@faker-js/faker' import { CollectionItemType } from '@/collection/domain/models/CollectionItemType' import { FileItemTypePreview } from '@/files/domain/models/FileItemTypePreview' import { PublicationStatus } from '@/shared/core/domain/models/PublicationStatus' +import { FileLabelType } from '@/files/domain/models/FileMetadata' import { FakerHelper } from '../../../shared/FakerHelper' +import { FileLabelMother } from './FileMetadataMother' export class FileItemTypePreviewMother { static create(props?: Partial): FileItemTypePreview { @@ -29,6 +31,12 @@ export class FileItemTypePreviewMother { datasetCitation: faker.lorem.paragraph(), publicationStatuses: [PublicationStatus.Published], releaseOrCreateDate: faker.date.past(), + tags: [ + FileLabelMother.create({ type: FileLabelType.TAG }), + FileLabelMother.create({ type: FileLabelType.CATEGORY }) + ], + observations: faker.datatype.number(), + variables: faker.datatype.number(), restricted: faker.datatype.boolean(), canDownloadFile: faker.datatype.boolean(), ...props diff --git a/tests/component/files/domain/models/FileLabelMother.ts b/tests/component/files/domain/models/FileLabelMother.ts new file mode 100644 index 000000000..91b0fb772 --- /dev/null +++ b/tests/component/files/domain/models/FileLabelMother.ts @@ -0,0 +1,11 @@ +import { faker } from '@faker-js/faker' +import { FileLabel, FileLabelType } from '@/files/domain/models/FileMetadata' + +export class FileLabelMother { + static create(props?: Partial): FileLabel { + return { + type: props?.type ?? FileLabelType.CATEGORY, + value: props?.value ?? faker.lorem.word() + } + } +} diff --git a/tests/component/files/domain/models/FileMetadataMother.ts b/tests/component/files/domain/models/FileMetadataMother.ts index b943a2160..82257978d 100644 --- a/tests/component/files/domain/models/FileMetadataMother.ts +++ b/tests/component/files/domain/models/FileMetadataMother.ts @@ -58,8 +58,8 @@ export class FileTypeMother { export class FileTabularDataMother { static create(props?: Partial): FileTabularData { return { - variablesCount: faker.datatype.number(100), - observationsCount: faker.datatype.number(100), + variables: faker.datatype.number(100), + observations: faker.datatype.number(100), unf: `UNF:6:xXw6cIZnwHWvmRdwhYCQZA==`, ...props } diff --git a/tests/component/sections/collection/collection-items-panel/file-card/FileCard.spec.tsx b/tests/component/sections/collection/collection-items-panel/file-card/FileCard.spec.tsx index c4201fea7..6d0f75cb6 100644 --- a/tests/component/sections/collection/collection-items-panel/file-card/FileCard.spec.tsx +++ b/tests/component/sections/collection/collection-items-panel/file-card/FileCard.spec.tsx @@ -17,5 +17,27 @@ describe('FileCard', () => { cy.contains(FileCardHelper.formatBytesToCompactNumber(filePreview.sizeInBytes)).should('exist') filePreview.description && cy.findByText(filePreview.description).should('exist') filePreview.datasetName && cy.findByText(filePreview.datasetName).should('exist') + filePreview.tags && + filePreview.tags.forEach((tag) => { + cy.findByText(tag.value).should('exist') + }) + }) + + it('should render the card if file is tabular', () => { + const filePreview = FileItemTypePreviewMother.create({ fileType: 'Tab-Delimited' }) + cy.customMount() + + cy.contains(DateHelper.toDisplayFormat(filePreview.releaseOrCreateDate)).should('exist') + cy.contains(filePreview.fileType).should('exist') + filePreview.checksum?.type && cy.contains(filePreview.checksum?.type).should('exist') + cy.contains(FileCardHelper.formatBytesToCompactNumber(filePreview.sizeInBytes)).should('exist') + filePreview.description && cy.findByText(filePreview.description).should('exist') + filePreview.datasetName && cy.findByText(filePreview.datasetName).should('exist') + filePreview.tags && + filePreview.tags.forEach((tag) => { + cy.findByText(tag.value).should('exist') + }) + filePreview.variables && cy.contains(filePreview.variables).should('exist') + filePreview.observations && cy.contains(filePreview.observations).should('exist') }) }) diff --git a/tests/component/sections/dataset/dataset-files/files-table/files-info/file-info-cell/file-info-data/FileTabularData.spec.tsx b/tests/component/sections/dataset/dataset-files/files-table/files-info/file-info-cell/file-info-data/FileTabularData.spec.tsx index f30b9386d..e501e5fff 100644 --- a/tests/component/sections/dataset/dataset-files/files-table/files-info/file-info-cell/file-info-data/FileTabularData.spec.tsx +++ b/tests/component/sections/dataset/dataset-files/files-table/files-info/file-info-cell/file-info-data/FileTabularData.spec.tsx @@ -4,8 +4,8 @@ import styles from '../../../../../../../../../src/sections/dataset/dataset-file describe('FileTabularData', () => { it('renders the tabular data and CopyToClipboardButton when tabularData is provided', () => { const tabularData = { - variablesCount: 10, - observationsCount: 100, + variables: 10, + observations: 100, unf: 'UNF:6:xXw6cIZnwHWvmRdwhYCQZA==' } cy.customMount() diff --git a/tests/component/sections/file/file-metadata/FileMetadata.spec.tsx b/tests/component/sections/file/file-metadata/FileMetadata.spec.tsx index d845be11e..256926532 100644 --- a/tests/component/sections/file/file-metadata/FileMetadata.spec.tsx +++ b/tests/component/sections/file/file-metadata/FileMetadata.spec.tsx @@ -385,7 +385,7 @@ describe('FileMetadata', () => { it('renders the tabular data if it exists', () => { const metadataWithTabularData = FileMetadataMother.create({ - tabularData: FileTabularDataMother.create({ variablesCount: 123, observationsCount: 321 }) + tabularData: FileTabularDataMother.create({ variables: 123, observations: 321 }) }) cy.customMount( { .getAllByDatasetPersistentId(dataset.persistentId, dataset.version) .then((files) => { const expectedTabularData = { - variablesCount: 7, - observationsCount: 10 + variables: 7, + observations: 10 } files.forEach((file) => { - expect(file.metadata.tabularData?.variablesCount).to.deep.equal( - expectedTabularData.variablesCount + expect(file.metadata.tabularData?.variables).to.deep.equal( + expectedTabularData.variables ) - expect(file.metadata.tabularData?.observationsCount).to.deep.equal( - expectedTabularData.observationsCount + expect(file.metadata.tabularData?.observations).to.deep.equal( + expectedTabularData.observations ) expect(file.metadata.tabularData?.unf).to.not.be.undefined })