Skip to content

Commit

Permalink
fix: get Root Collection alias using ':root' keyword
Browse files Browse the repository at this point in the history
  • Loading branch information
ekraffmiller committed Oct 25, 2024
1 parent 02bc675 commit bdc11b3
Show file tree
Hide file tree
Showing 13 changed files with 75 additions and 57 deletions.
2 changes: 1 addition & 1 deletion src/collection/domain/models/Collection.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,4 @@ export interface CollectionInputLevel {
required: boolean
}

export const ROOT_COLLECTION_ALIAS = 'root'
export const ROOT_COLLECTION_ALIAS = ':root'
2 changes: 1 addition & 1 deletion src/collection/domain/useCases/getCollectionById.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { CollectionRepository } from '../repositories/CollectionRepository'
export async function getCollectionById(
collectionRepository: CollectionRepository,
id: string
): Promise<Collection | undefined> {
): Promise<Collection> {
return collectionRepository.getById(id).catch((error: Error) => {
throw new Error(error.message)
})
Expand Down
10 changes: 3 additions & 7 deletions src/sections/Route.enum.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import { ROOT_COLLECTION_ALIAS } from '../collection/domain/models/Collection'

export enum Route {
HOME = '/',
SIGN_UP = '/dataverseuser.xhtml?editMode=CREATE&redirectPage=%2Fdataverse.xhtml',
Expand All @@ -17,11 +15,9 @@ export enum Route {
}

export const RouteWithParams = {
COLLECTIONS: (collectionId?: string) => `/collections/${collectionId ?? 'root'}`,
CREATE_COLLECTION: (ownerCollectionId?: string) =>
`/collections/${ownerCollectionId ?? ROOT_COLLECTION_ALIAS}/create`,
CREATE_DATASET: (collectionId?: string) =>
`/datasets/${collectionId ?? ROOT_COLLECTION_ALIAS}/create`
COLLECTIONS: (collectionId: string) => `/collections/${collectionId}`,
CREATE_COLLECTION: (ownerCollectionId: string) => `/collections/${ownerCollectionId}/create`,
CREATE_DATASET: (collectionId: string) => `/datasets/${collectionId}/create`
}

export enum QueryParamKey {
Expand Down
31 changes: 16 additions & 15 deletions src/sections/collection/Collection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -75,23 +75,24 @@ export function Collection({
/>
</div>
)}

<CollectionItemsPanel
key={collectionId}
collectionId={collectionId}
collectionRepository={collectionRepository}
collectionQueryParams={collectionQueryParams}
addDataSlot={
showAddDataActions ? (
<AddDataActionsButton
collectionId={collection.id}
canAddCollection={canUserAddCollection}
canAddDataset={canUserAddDataset}
/>
) : null
}
/>
</>
)}
<CollectionItemsPanel
key={collectionId}
collectionId={collectionId}
collectionRepository={collectionRepository}
collectionQueryParams={collectionQueryParams}
addDataSlot={
showAddDataActions ? (
<AddDataActionsButton
collectionId={collectionId}
canAddCollection={canUserAddCollection}
canAddDataset={canUserAddDataset}
/>
) : null
}
/>
</Col>
</Row>
)
Expand Down
3 changes: 2 additions & 1 deletion src/sections/collection/CollectionFactory.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { CollectionJSDataverseRepository } from '../../collection/infrastructure
import { Collection } from './Collection'
import { INFINITE_SCROLL_ENABLED } from './config'
import { useGetCollectionQueryParams } from './useGetCollectionQueryParams'
import { ROOT_COLLECTION_ALIAS } from '@/collection/domain/models/Collection'

const collectionRepository = new CollectionJSDataverseRepository()
export class CollectionFactory {
Expand All @@ -14,7 +15,7 @@ export class CollectionFactory {

function CollectionWithSearchParams() {
const collectionQueryParams = useGetCollectionQueryParams()
const { collectionId = 'root' } = useParams<{ collectionId: string }>()
const { collectionId = ROOT_COLLECTION_ALIAS } = useParams<{ collectionId: string }>()
const location = useLocation()
const state = location.state as { published: boolean; created: boolean } | undefined
const created = state?.created ?? false
Expand Down
6 changes: 3 additions & 3 deletions src/sections/create-dataset/CreateDataset.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,14 @@ interface CreateDatasetProps {
datasetRepository: DatasetRepository
metadataBlockInfoRepository: MetadataBlockInfoRepository
collectionRepository: CollectionRepository
collectionId?: string
collectionId: string
}

export function CreateDataset({
datasetRepository,
metadataBlockInfoRepository,
collectionRepository,
collectionId = ROOT_COLLECTION_ALIAS
collectionId
}: CreateDatasetProps) {
const { t } = useTranslation('createDataset')
const { isModalOpen, hideModal } = useNotImplementedModal()
Expand Down Expand Up @@ -84,7 +84,7 @@ export function CreateDataset({
<h1>{t('pageTitle')}</h1>
</header>
<SeparationLine />
<HostCollectionForm collectionId={collectionId} />
<HostCollectionForm collectionId={collection.id} />

<DatasetMetadataForm
mode="create"
Expand Down
4 changes: 2 additions & 2 deletions src/sections/layout/Layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@ import { Container } from '@iqss/dataverse-design-system'
import styles from './Layout.module.scss'
import { FooterFactory } from './footer/FooterFactory'
import TopBarProgressIndicator from './topbar-progress-indicator/TopbarProgressIndicator'
import { Header } from './header/Header'
import { HeaderFactory } from './header/HeaderFactory'

export function Layout() {
return (
<>
<TopBarProgressIndicator />
<Header />
{HeaderFactory.create()}
<main>
<Container className={styles['body-container']}>
<Outlet />
Expand Down
9 changes: 5 additions & 4 deletions src/sections/layout/header/Header.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,13 @@ import { Route } from '../../Route.enum'
import { useSession } from '../../session/SessionContext'
import { BASE_URL } from '../../../config'
import { LoggedInHeaderActions } from './LoggedInHeaderActions'
import { CollectionJSDataverseRepository } from '../../../collection/infrastructure/repositories/CollectionJSDataverseRepository'
import styles from './Header.module.scss'
import { CollectionRepository } from '@/collection/domain/repositories/CollectionRepository'

const collectionRepository = new CollectionJSDataverseRepository()

export function Header() {
interface HeaderProps {
collectionRepository: CollectionRepository
}
export function Header({ collectionRepository }: HeaderProps) {
const { t } = useTranslation('header')
const { user } = useSession()

Expand Down
11 changes: 11 additions & 0 deletions src/sections/layout/header/HeaderFactory.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { ReactElement } from 'react'
import { Header } from './Header'
import { CollectionJSDataverseRepository } from '@/collection/infrastructure/repositories/CollectionJSDataverseRepository'

const collectionRepository = new CollectionJSDataverseRepository()

export class HeaderFactory {
static create(): ReactElement {
return <Header collectionRepository={collectionRepository} />
}
}
14 changes: 12 additions & 2 deletions src/sections/layout/header/LoggedInHeaderActions.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ import { User } from '../../../users/domain/models/User'
import { CollectionRepository } from '../../../collection/domain/repositories/CollectionRepository'
import { ROOT_COLLECTION_ALIAS } from '../../../collection/domain/models/Collection'
import { AccountHelper } from '../../account/AccountHelper'
import { useCollection } from '@/sections/collection/useCollection'
import Skeleton from 'react-loading-skeleton'

const currentPage = 0

Expand All @@ -23,6 +25,7 @@ export const LoggedInHeaderActions = ({
const { t } = useTranslation('header')
const { logout } = useSession()
const navigate = useNavigate()
const { collection, isLoading } = useCollection(collectionRepository, ROOT_COLLECTION_ALIAS)

const { collectionUserPermissions } = useGetCollectionUserPermissions({
collectionIdOrAlias: ROOT_COLLECTION_ALIAS,
Expand All @@ -34,9 +37,16 @@ export const LoggedInHeaderActions = ({
navigate(currentPage)
})
}
if (isLoading) {
return <Skeleton />
}

if (!collection) {
return null
}

const createCollectionRoute = RouteWithParams.CREATE_COLLECTION()
const createDatasetRoute = RouteWithParams.CREATE_DATASET()
const createCollectionRoute = RouteWithParams.CREATE_COLLECTION(collection.id)
const createDatasetRoute = RouteWithParams.CREATE_DATASET(collection.id)

const canUserAddCollectionToRoot = Boolean(collectionUserPermissions?.canAddCollection)
const canUserAddDatasetToRoot = Boolean(collectionUserPermissions?.canAddDataset)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { RouteWithParams } from '../../Route.enum'
import styles from './AddDataActionsButton.module.scss'

interface AddDataActionsButtonProps {
collectionId?: string
collectionId: string
canAddCollection: boolean
canAddDataset: boolean
}
Expand Down
21 changes: 7 additions & 14 deletions tests/component/sections/create-dataset/CreateDataset.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ const collectionMetadataBlocksInfo =
MetadataBlockInfoMother.getByCollectionIdDisplayedOnCreateTrue()

const COLLECTION_NAME = 'Collection Name'
const collection = CollectionMother.create({ name: COLLECTION_NAME })
const collection = CollectionMother.create({ name: COLLECTION_NAME, id: 'test-alias' })

describe('Create Dataset', () => {
beforeEach(() => {
Expand All @@ -36,6 +36,7 @@ describe('Create Dataset', () => {
datasetRepository={datasetRepository}
metadataBlockInfoRepository={metadataBlockInfoRepository}
collectionRepository={collectionRepository}
collectionId={'non-existing-collection'}
/>
)
cy.findByText('Page Not Found').should('exist')
Expand All @@ -52,6 +53,7 @@ describe('Create Dataset', () => {
datasetRepository={datasetRepository}
metadataBlockInfoRepository={metadataBlockInfoRepository}
collectionRepository={collectionRepository}
collectionId={'test-collectionId'}
/>
)
cy.clock()
Expand All @@ -67,6 +69,7 @@ describe('Create Dataset', () => {
datasetRepository={datasetRepository}
metadataBlockInfoRepository={metadataBlockInfoRepository}
collectionRepository={collectionRepository}
collectionId={'test-collectionId'}
/>
)

Expand All @@ -78,18 +81,6 @@ describe('Create Dataset', () => {
.should('have.class', 'active')
})

it('renders the Host Collection Form for root collection', () => {
cy.customMount(
<CreateDataset
datasetRepository={datasetRepository}
metadataBlockInfoRepository={metadataBlockInfoRepository}
collectionRepository={collectionRepository}
/>
)
cy.findByText(/^Host Collection/i).should('exist')
cy.findByDisplayValue('root').should('exist')
})

it('renders the Host Collection Form', () => {
cy.customMount(
<NotImplementedModalProvider>
Expand All @@ -102,7 +93,7 @@ describe('Create Dataset', () => {
</NotImplementedModalProvider>
)
cy.findByText(/^Host Collection/i).should('exist')
cy.findByDisplayValue('test-collectionId').should('exist')
cy.findByDisplayValue('test-alias').should('exist')
cy.findByText(/^Edit Host Collection/i)
.should('exist')
.click()
Expand All @@ -123,6 +114,7 @@ describe('Create Dataset', () => {
datasetRepository={datasetRepository}
metadataBlockInfoRepository={metadataBlockInfoRepository}
collectionRepository={collectionRepository}
collectionId={'test-collectionId'}
/>
)
cy.findAllByTestId('not-allowed-to-create-dataset-alert').should('exist')
Expand All @@ -134,6 +126,7 @@ describe('Create Dataset', () => {
datasetRepository={datasetRepository}
metadataBlockInfoRepository={metadataBlockInfoRepository}
collectionRepository={collectionRepository}
collectionId={'test-collectionId'}
/>
)
cy.findAllByTestId('not-allowed-to-create-dataset-alert').should('not.exist')
Expand Down
17 changes: 11 additions & 6 deletions tests/component/sections/layout/header/Header.spec.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,19 +2,24 @@ import { UserMother } from '../../../users/domain/models/UserMother'
import { UserRepository } from '../../../../../src/users/domain/repositories/UserRepository'
import { Header } from '../../../../../src/sections/layout/header/Header'
import { SessionProvider } from '../../../../../src/sections/session/SessionProvider'
import { CollectionMother } from '@tests/component/collection/domain/models/CollectionMother'
import { CollectionRepository } from '@/collection/domain/repositories/CollectionRepository'

const testUser = UserMother.create()
const rootCollection = CollectionMother.create({ id: 'root' })
const userRepository: UserRepository = {} as UserRepository
const collectionRepository: CollectionRepository = {} as CollectionRepository
describe('Header component', () => {
beforeEach(() => {
userRepository.getAuthenticated = cy.stub().resolves(testUser)
userRepository.removeAuthenticated = cy.stub().resolves()
collectionRepository.getById = cy.stub().resolves(rootCollection)
})

it('displays the brand', () => {
cy.customMount(
<SessionProvider repository={userRepository}>
<Header />
<Header collectionRepository={collectionRepository} />
</SessionProvider>
)

Expand All @@ -25,7 +30,7 @@ describe('Header component', () => {
it('displays the user name when the user is logged in', () => {
cy.customMount(
<SessionProvider repository={userRepository}>
<Header />
<Header collectionRepository={collectionRepository} />
</SessionProvider>
)

Expand All @@ -40,7 +45,7 @@ describe('Header component', () => {
it('displays the Add Data Button when the user is logged in', () => {
cy.customMount(
<SessionProvider repository={userRepository}>
<Header />
<Header collectionRepository={collectionRepository} />
</SessionProvider>
)

Expand All @@ -59,7 +64,7 @@ describe('Header component', () => {

cy.customMount(
<SessionProvider repository={userRepository}>
<Header />
<Header collectionRepository={collectionRepository} />
</SessionProvider>
)

Expand All @@ -76,7 +81,7 @@ describe('Header component', () => {

cy.customMount(
<SessionProvider repository={userRepository}>
<Header />
<Header collectionRepository={collectionRepository} />
</SessionProvider>
)

Expand All @@ -89,7 +94,7 @@ describe('Header component', () => {
it('log outs the user after clicking Log Out', () => {
cy.customMount(
<SessionProvider repository={userRepository}>
<Header />
<Header collectionRepository={collectionRepository} />
</SessionProvider>
)

Expand Down

0 comments on commit bdc11b3

Please sign in to comment.