Skip to content

Commit

Permalink
merge latest from feat/562-add-collection-facets
Browse files Browse the repository at this point in the history
  • Loading branch information
ekraffmiller committed Dec 18, 2024
2 parents 683b587 + d170bc8 commit b1b8bf3
Show file tree
Hide file tree
Showing 90 changed files with 9,889 additions and 1,919 deletions.
6,468 changes: 6,400 additions & 68 deletions merged-coverage/lcov.info

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
import { PropsWithChildren } from 'react'
import { Dropdown } from 'react-bootstrap'

export function DropdownHeader({ children }: PropsWithChildren) {
return <Dropdown.Header>{children}</Dropdown.Header>
interface DropdownHeaderProps {
className?: string
children: React.ReactNode
}

export function DropdownHeader({ className, children }: DropdownHeaderProps) {
return <Dropdown.Header className={className}>{children}</Dropdown.Header>
}
7 changes: 6 additions & 1 deletion public/locales/en/collection.json
Original file line number Diff line number Diff line change
Expand Up @@ -43,5 +43,10 @@
},
"publishedAlert": "Your collection is now public.",
"addFacetFilter": "Add {{labelName}} facet filter",
"removeSelectedFacet": "Remove {{labelName}} facet filter"
"removeSelectedFacet": "Remove {{labelName}} facet filter",
"editedAlert": "You have successfully updated your collection!",
"editCollection": {
"edit": "Edit",
"generalInfo": "General Information"
}
}
79 changes: 0 additions & 79 deletions public/locales/en/createCollection.json
Original file line number Diff line number Diff line change
@@ -1,83 +1,4 @@
{
"pageTitle": "Create Collection",
"fields": {
"hostCollection": {
"label": "Host Collection",
"description": "The collection which contains this data.",
"required": "Host Collection is required"
},
"name": {
"label": "Collection Name",
"description": "The project, department, university, professor, or journal this collection will contain data for.",
"required": "Collection Name is required"
},
"affiliation": {
"label": "Affiliation",
"description": "The organization with which this collection is affiliated."
},
"alias": {
"label": "Identifier",
"description": "Short name used for the URL of this collection.",
"required": "Identifier is required",
"invalid": {
"format": "Identifier is not valid. Valid characters are a-Z, 0-9, '_', and '-'.",
"maxLength": "Identifier must be at most {{maxLength}} characters."
},
"suggestion": "Psst... try this"
},
"storage": {
"label": "Storage",
"description": "A storage service to be used for datasets in this collection."
},
"type": {
"label": "Category",
"description": "The type that most closely reflects this collection.",
"required": "Category is required"
},
"description": {
"label": "Description",
"description": "A summary describing the purpose, nature or scope of this collection.",
"subLabel": "This field supports only certain <htmlTooltip>HTML tags</htmlTooltip>.",
"htmlAllowedTags": "<a>, <b>, <blockquote>, <br>, <code>, <del>, <dd>, <dl>, <dt>, <em>, <hr>, <h1>-<h3>, <i>, <img>, <kbd>, <li>, <ol>, <p>, <pre>, <s>, <sup>, <sub>, <strong>, <strike>, <u>, <ul>"
},
"contacts": {
"label": "Email",
"description": "The email address(es) of the contact(s) for the collection.",
"required": "Email is required",
"invalid": "Email is not a valid email"
},
"metadataFields": {
"sectionLabel": "Metadata Fields",
"helperText": "Choose the metadata fields to use in dataset templates and when adding a dataset to this collection.",
"useMetadataFieldsFrom": "Use metadata fields from",
"inputLevelsTable": {
"hideTableAriaLabel": "Hide input levels table",
"requiredByDataverse": "Required by Dataverse",
"hidden": "Hidden",
"optional": "Optional",
"required": "Required",
"conditionallyRequired": "Conditionally Required"
}
},
"browseSearchFacets": {
"label": "Browse/Search Facets",
"helperText": "Choose and order the metadata fields to use as facets when browsing this collection.",
"useBrowseSearchFacetsFrom": "Use browse/search facets from",
"selectedFacets": "Selected"
}
},
"confirmResetModal": {
"title": "Reset Modifications",
"warning": "Are you sure you want to reset the selected metadata fields? If you do this, any customizations (hidden, required, optional) you have done will no longer appear.",
"continue": "Continue",
"cancel": "Cancel"
},
"submitStatus": {
"success": "Collection created successfully."
},
"formButtons": {
"save": "Create Collection",
"cancel": "Cancel"
},
"notAllowedToCreateCollection": "You do not have permissions to create a collection within this collection."
}
8 changes: 8 additions & 0 deletions public/locales/en/editCollection.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"pageTitle": "Edit Collection",
"notAllowedToEditCollection": "You do not have permissions to edit this collection.",
"infoAlert": {
"heading": "Edit Collection",
"text": "Edit your collection and click Save Changes. Asterisks indicate required fields."
}
}
86 changes: 86 additions & 0 deletions public/locales/en/shared.json
Original file line number Diff line number Diff line change
Expand Up @@ -63,5 +63,91 @@
"editMode": "Save Changes"
},
"cancelButton": "Cancel"
},
"collectionForm": {
"fields": {
"hostCollection": {
"label": "Host Collection",
"description": "The collection which contains this data.",
"required": "Host Collection is required"
},
"name": {
"label": "Collection Name",
"description": "The project, department, university, professor, or journal this collection will contain data for.",
"required": "Collection Name is required"
},
"affiliation": {
"label": "Affiliation",
"description": "The organization with which this collection is affiliated."
},
"alias": {
"label": "Identifier",
"description": "Short name used for the URL of this collection.",
"required": "Identifier is required",
"invalid": {
"format": "Identifier is not valid. Valid characters are a-Z, 0-9, '_', and '-'.",
"maxLength": "Identifier must be at most {{maxLength}} characters."
},
"suggestion": "Psst... try this"
},
"storage": {
"label": "Storage",
"description": "A storage service to be used for datasets in this collection."
},
"type": {
"label": "Category",
"description": "The type that most closely reflects this collection.",
"required": "Category is required"
},
"description": {
"label": "Description",
"description": "A summary describing the purpose, nature or scope of this collection.",
"subLabel": "This field supports only certain <htmlTooltip>HTML tags</htmlTooltip>.",
"htmlAllowedTags": "<a>, <b>, <blockquote>, <br>, <code>, <del>, <dd>, <dl>, <dt>, <em>, <hr>, <h1>-<h3>, <i>, <img>, <kbd>, <li>, <ol>, <p>, <pre>, <s>, <sup>, <sub>, <strong>, <strike>, <u>, <ul>"
},
"contacts": {
"label": "Email",
"description": "The email address(es) of the contact(s) for the collection.",
"required": "Email is required",
"invalid": "Email is not a valid email"
},
"metadataFields": {
"sectionLabel": "Metadata Fields",
"helperText": "Choose the metadata fields to use in dataset templates and when adding a dataset to this collection.",
"useMetadataFieldsFrom": "Use metadata fields from",
"inputLevelsTable": {
"hideTableAriaLabel": "Hide input levels table",
"requiredByDataverse": "Required by Dataverse",
"hidden": "Hidden",
"optional": "Optional",
"required": "Required",
"conditionallyRequired": "Conditionally Required"
}
},
"browseSearchFacets": {
"label": "Browse/Search Facets",
"helperText": "Choose and order the metadata fields to use as facets when browsing this collection.",
"useBrowseSearchFacetsFrom": "Use browse/search facets from",
"selectedFacets": "Selected",
"invalid": {
"minLength": "At least one facet must be selected."
}
}
},
"confirmResetModal": {
"title": "Reset Modifications",
"warning": "Are you sure you want to reset the selected metadata fields? If you do this, any customizations (hidden, required, optional) you have done will no longer appear.",
"continue": "Continue",
"cancel": "Cancel"
},
"submitStatus": {
"createSuccess": "Collection created successfully.",
"editSuccess": "Collection updated successfully."
},
"saveButton": {
"createMode": "Create Collection",
"editMode": "Save Changes"
},
"cancelButton": "Cancel"
}
}
13 changes: 7 additions & 6 deletions src/collection/domain/models/Collection.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
import { UpwardHierarchyNode } from '../../../shared/hierarchy/domain/models/UpwardHierarchyNode'
import { CollectionContact } from './CollectionContact'
import { CollectionType } from './CollectionType'
import { CollectionInputLevel } from './CollectionInputLevel'

export interface Collection {
id: string
Expand All @@ -8,10 +11,8 @@ export interface Collection {
description?: string
affiliation?: string
inputLevels?: CollectionInputLevel[]
}

export interface CollectionInputLevel {
datasetFieldName: string
include: boolean
required: boolean
type: CollectionType
contacts: CollectionContact[]
isMetadataBlockRoot: boolean
isFacetRoot: boolean
}
4 changes: 4 additions & 0 deletions src/collection/domain/models/CollectionContact.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
export interface CollectionContact {
email: string
displayOrder: number
}
5 changes: 5 additions & 0 deletions src/collection/domain/models/CollectionInputLevel.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
export interface CollectionInputLevel {
datasetFieldName: string
include: boolean
required: boolean
}
1 change: 1 addition & 0 deletions src/collection/domain/models/CollectionItemsQueryParams.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,6 @@ export enum CollectionItemsQueryParams {
ORDER = 'order',
START = 'start',
TYPES = 'types',
QUERY = 'q',
FILTER_QUERIES = 'fqs'
}
11 changes: 11 additions & 0 deletions src/collection/domain/models/CollectionType.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
export enum CollectionType {
RESEARCHERS = 'RESEARCHERS',
RESEARCH_PROJECTS = 'RESEARCH_PROJECTS',
JOURNALS = 'JOURNALS',
ORGANIZATIONS_INSTITUTIONS = 'ORGANIZATIONS_INSTITUTIONS',
TEACHING_COURSES = 'TEACHING_COURSES',
UNCATEGORIZED = 'UNCATEGORIZED',
LABORATORY = 'LABORATORY',
RESEARCH_GROUP = 'RESEARCH_GROUP',
DEPARTMENT = 'DEPARTMENT'
}
1 change: 1 addition & 0 deletions src/collection/domain/repositories/CollectionRepository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,5 @@ export interface CollectionRepository {
paginationInfo: CollectionItemsPaginationInfo,
searchCriteria?: CollectionSearchCriteria
): Promise<CollectionItemSubset>
edit(collectionIdOrAlias: string, updatedCollection: CollectionDTO): Promise<void>
}
14 changes: 2 additions & 12 deletions src/collection/domain/useCases/DTOs/CollectionDTO.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { CollectionType } from '../../models/CollectionType'

export interface CollectionDTO {
alias: string
name: string
Expand All @@ -10,18 +12,6 @@ export interface CollectionDTO {
inputLevels?: CollectionInputLevelDTO[]
}

export enum CollectionType {
RESEARCHERS = 'RESEARCHERS',
RESEARCH_PROJECTS = 'RESEARCH_PROJECTS',
JOURNALS = 'JOURNALS',
ORGANIZATIONS_INSTITUTIONS = 'ORGANIZATIONS_INSTITUTIONS',
TEACHING_COURSES = 'TEACHING_COURSES',
UNCATEGORIZED = 'UNCATEGORIZED',
LABORATORY = 'LABORATORY',
RESEARCH_GROUP = 'RESEARCH_GROUP',
DEPARTMENT = 'DEPARTMENT'
}

export interface CollectionInputLevelDTO {
datasetFieldName: string
include: boolean
Expand Down
13 changes: 13 additions & 0 deletions src/collection/domain/useCases/editCollection.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { WriteError } from '@iqss/dataverse-client-javascript'
import { CollectionRepository } from '../repositories/CollectionRepository'
import { CollectionDTO } from './DTOs/CollectionDTO'

export async function editCollection(
collectionRepository: CollectionRepository,
updatedCollection: CollectionDTO,
collectionId: string
): Promise<void> {
return collectionRepository.edit(collectionId, updatedCollection).catch((error: WriteError) => {
throw error
})
}
6 changes: 5 additions & 1 deletion src/collection/infrastructure/mappers/JSCollectionMapper.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,11 @@ export class JSCollectionMapper {
jsCollection.alias,
jsCollection.isPartOf
),
inputLevels: jsCollection.inputLevels
inputLevels: jsCollection.inputLevels,
type: jsCollection.type,
contacts: jsCollection.contacts ?? [],
isMetadataBlockRoot: jsCollection.isMetadataBlockRoot,
isFacetRoot: jsCollection.isFacetRoot
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ import {
getCollectionFacets,
getCollectionUserPermissions,
getCollectionItems,
publishCollection
publishCollection,
updateCollection
} from '@iqss/dataverse-client-javascript'
import { JSCollectionMapper } from '../mappers/JSCollectionMapper'
import { CollectionDTO } from '../../domain/useCases/DTOs/CollectionDTO'
Expand Down Expand Up @@ -62,4 +63,8 @@ export class CollectionJSDataverseRepository implements CollectionRepository {
publish(collectionIdOrAlias: number | string): Promise<void> {
return publishCollection.execute(collectionIdOrAlias)
}

edit(collectionIdOrAlias: string, updatedCollection: CollectionDTO): Promise<void> {
return updateCollection.execute(collectionIdOrAlias, updatedCollection)
}
}
2 changes: 1 addition & 1 deletion src/files/domain/models/FilePreview.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ export interface FilePreview {
ingest: FileIngest
metadata: FileMetadata
permissions: FilePermissions
datasetVersionNumber?: DatasetVersionNumber
datasetVersionNumber: DatasetVersionNumber
releaseOrCreateDate?: Date
someDatasetVersionHasBeenReleased?: boolean
datasetPersistentId?: string
Expand Down
15 changes: 15 additions & 0 deletions src/router/routes.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,12 @@ const CreateCollectionPage = lazy(() =>
)
)

const EditCollectionPage = lazy(() =>
import('../sections/edit-collection/EditCollectionFactory').then(({ EditCollectionFactory }) => ({
default: () => EditCollectionFactory.create()
}))
)

const CreateDatasetPage = lazy(() =>
import('../sections/create-dataset/CreateDatasetFactory').then(({ CreateDatasetFactory }) => ({
default: () => CreateDatasetFactory.create()
Expand Down Expand Up @@ -130,6 +136,15 @@ export const routes: RouteObject[] = [
),
errorElement: <ErrorPage />
},
{
path: Route.EDIT_COLLECTION,
element: (
<Suspense fallback={<AppLoader />}>
<EditCollectionPage />
</Suspense>
),
errorElement: <ErrorPage />
},
{
path: Route.CREATE_DATASET,
element: (
Expand Down
Loading

0 comments on commit b1b8bf3

Please sign in to comment.