Skip to content

Commit 4027556

Browse files
authored
Merge pull request #609 from IQSS/569-implement-collection-page-contact-button-and-form
Contact Collection and Dataset owner feature
2 parents f2d31cf + f6ff9cd commit 4027556

30 files changed

Lines changed: 1185 additions & 12 deletions

File tree

public/locales/en/shared.json

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,5 +152,40 @@
152152
"editSuccess": "Collection updated successfully."
153153
},
154154
"createCollection": "Create Collection"
155+
},
156+
"contact": {
157+
"message": "Message",
158+
"subject": "Subject",
159+
"title": {
160+
"collection": "Contact",
161+
"dataset": "Contact Owner"
162+
},
163+
"contactCollection": "Email Collection Contact",
164+
"contactDataset": "Email Dataset Contact",
165+
"helpText": "Email the contact for this collection.",
166+
"verificationText": "Please fill this out to prove you are not a robot.",
167+
"contactSuccess": "Message sent.",
168+
"validation": {
169+
"captchaInput": {
170+
"required": "Validation is required.",
171+
"invalid": "Incorrect answer.",
172+
"onlyNumber": "Only numbers are allowed.",
173+
"maxLength": "Answer cannot exceed {{maxLength}} ."
174+
},
175+
"email": {
176+
"invalid": "Invalid email format.",
177+
"required": "Email is required.",
178+
"maxLength": "Email cannot exceed {{maxLength}} ."
179+
},
180+
"subject": {
181+
"required": "Subject is required.",
182+
"maxLength": "Subject cannot exceed {{maxLength}} ."
183+
},
184+
"message": {
185+
"required": "Message is required.",
186+
"maxLength": "Message cannot exceed {{maxLength}} ."
187+
}
188+
},
189+
"defaultFeedbackSubmitError": "An error occurred while submitting your feedback. Please try again later."
155190
}
156191
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export interface ContactResponse {
2+
subject: string
3+
body: string
4+
fromEmail: string
5+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { FeedbackDTO } from '../useCases/FeedbackDTO'
2+
import { ContactResponse } from '../models/ContactResponse'
3+
4+
export interface ContactRepository {
5+
sendFeedbacktoOwners: (feedbackDTO: FeedbackDTO) => Promise<ContactResponse[]>
6+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export interface FeedbackDTO {
2+
targetId?: number
3+
identifier?: string
4+
fromEmail: string
5+
body: string
6+
subject: string
7+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { ContactRepository } from '../repositories/ContactRepository'
2+
import { WriteError } from '@iqss/dataverse-client-javascript'
3+
import { FeedbackDTO } from '../useCases/FeedbackDTO'
4+
import { ContactResponse } from '../models/ContactResponse'
5+
6+
export async function sendFeedbacktoOwners(
7+
ContactRepository: ContactRepository,
8+
FeedbackDTO: FeedbackDTO
9+
): Promise<ContactResponse[]> {
10+
return ContactRepository.sendFeedbacktoOwners(FeedbackDTO).catch((error: WriteError) => {
11+
throw new Error(error.message)
12+
})
13+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { submitContactInfo } from '@iqss/dataverse-client-javascript'
2+
import { ContactResponse } from '../domain/models/ContactResponse'
3+
import { ContactRepository } from '../domain/repositories/ContactRepository'
4+
import { FeedbackDTO } from '../domain/useCases/FeedbackDTO'
5+
6+
export class ContactJSDataverseRepository implements ContactRepository {
7+
async sendFeedbacktoOwners(feedbackDTO: FeedbackDTO): Promise<ContactResponse[]> {
8+
return submitContactInfo.execute(feedbackDTO).then((response: ContactResponse[]) => response)
9+
}
10+
}

src/sections/collection/Collection.tsx

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,11 @@ import { PageNotFound } from '../page-not-found/PageNotFound'
1414
import { CreatedAlert } from './CreatedAlert'
1515
import { PublishCollectionButton } from './publish-collection/PublishCollectionButton'
1616
import { ShareCollectionButton } from './share-collection-button/ShareCollectionButton'
17+
import { ContactButton } from '@/sections/shared/contact/ContactButton'
1718
import { EditCollectionDropdown } from './edit-collection-dropdown/EditCollectionDropdown'
1819
import { FeaturedItems } from './featured-items/FeaturedItems'
1920
import styles from './Collection.module.scss'
21+
import { ContactRepository } from '@/contact/domain/repositories/ContactRepository'
2022

2123
interface CollectionProps {
2224
collectionRepository: CollectionRepository
@@ -26,6 +28,7 @@ interface CollectionProps {
2628
edited?: boolean
2729
collectionQueryParams: UseCollectionQueryParamsReturnType
2830
infiniteScrollEnabled?: boolean
31+
contactRepository: ContactRepository
2932
}
3033

3134
export function Collection({
@@ -34,7 +37,8 @@ export function Collection({
3437
created,
3538
published,
3639
edited,
37-
collectionQueryParams
40+
collectionQueryParams,
41+
contactRepository
3842
}: CollectionProps) {
3943
useScrollTop()
4044
const { t } = useTranslation('collection')
@@ -47,7 +51,6 @@ export function Collection({
4751
collectionIdOrAlias: collectionIdFromParams,
4852
collectionRepository
4953
})
50-
5154
const canUserAddCollection = Boolean(collectionUserPermissions?.canAddCollection)
5255
const canUserEditCollection = Boolean(collectionUserPermissions?.canEditCollection)
5356
const canUserAddDataset = Boolean(collectionUserPermissions?.canAddDataset)
@@ -94,8 +97,12 @@ export function Collection({
9497
<div className={styles['metrics-actions-container']}>
9598
<div className={styles.metrics}></div>
9699
<div className={styles['right-content']}>
97-
{/* 👇 Here should go Contact button also */}
98-
{/* <ContactButton /> */}
100+
<ContactButton
101+
toContactName={collection.name}
102+
contactObjectType="collection"
103+
id={collection.id}
104+
contactRepository={contactRepository}
105+
/>
99106

100107
<ShareCollectionButton />
101108

src/sections/collection/CollectionFactory.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
import { ReactElement } from 'react'
22
import { useLocation, useParams } from 'react-router-dom'
33
import { CollectionJSDataverseRepository } from '../../collection/infrastructure/repositories/CollectionJSDataverseRepository'
4+
import { ContactJSDataverseRepository } from '@/contact/infrastructure/ContactJSDataverseRepository'
45
import { Collection } from './Collection'
56
import { INFINITE_SCROLL_ENABLED } from './config'
67
import { useGetCollectionQueryParams } from './useGetCollectionQueryParams'
78

89
const collectionRepository = new CollectionJSDataverseRepository()
10+
const contactRepository = new ContactJSDataverseRepository()
11+
912
export class CollectionFactory {
1013
static create(): ReactElement {
1114
return <CollectionWithSearchParams />
@@ -32,6 +35,7 @@ function CollectionWithSearchParams() {
3235
published={published}
3336
edited={edited}
3437
infiniteScrollEnabled={INFINITE_SCROLL_ENABLED}
38+
contactRepository={contactRepository}
3539
/>
3640
)
3741
}

src/sections/dataset/Dataset.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,14 @@ import { QueryParamKey, Route } from '../Route.enum'
2727
import { MetadataBlockInfoRepository } from '../../metadata-block-info/domain/repositories/MetadataBlockInfoRepository'
2828
import { CollectionRepository } from '../../collection/domain/repositories/CollectionRepository'
2929
import { DatasetTerms } from '@/sections/dataset/dataset-terms/DatasetTerms'
30+
import { ContactRepository } from '@/contact/domain/repositories/ContactRepository'
3031

3132
interface DatasetProps {
3233
datasetRepository: DatasetRepository
3334
fileRepository: FileRepository
3435
metadataBlockInfoRepository: MetadataBlockInfoRepository
3536
collectionRepository: CollectionRepository
37+
contactRepository: ContactRepository
3638
created?: boolean
3739
metadataUpdated?: boolean
3840
filesTabInfiniteScrollEnabled?: boolean
@@ -45,6 +47,7 @@ export function Dataset({
4547
fileRepository,
4648
metadataBlockInfoRepository,
4749
collectionRepository,
50+
contactRepository,
4851
created,
4952
metadataUpdated,
5053
filesTabInfiniteScrollEnabled,
@@ -129,6 +132,7 @@ export function Dataset({
129132
datasetRepository={datasetRepository}
130133
collectionRepository={collectionRepository}
131134
dataset={dataset}
135+
contactRepository={contactRepository}
132136
/>
133137
</Col>
134138
</Row>

src/sections/dataset/DatasetFactory.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,13 @@ import { AlertProvider } from '../alerts/AlertProvider'
1616
import { searchParamVersionToDomainVersion } from '../../router'
1717
import { FILES_TAB_INFINITE_SCROLL_ENABLED } from './config'
1818
import { CollectionJSDataverseRepository } from '@/collection/infrastructure/repositories/CollectionJSDataverseRepository'
19+
import { ContactJSDataverseRepository } from '@/contact/infrastructure/ContactJSDataverseRepository'
1920

2021
const collectionRepository = new CollectionJSDataverseRepository()
2122
const datasetRepository = new DatasetJSDataverseRepository()
2223
const fileRepository = new FileJSDataverseRepository()
2324
const metadataBlockInfoRepository = new MetadataBlockInfoJSDataverseRepository()
24-
25+
const contactRepository = new ContactJSDataverseRepository()
2526
const settingRepository = new SettingJSDataverseRepository()
2627

2728
export class DatasetFactory {
@@ -73,6 +74,7 @@ function DatasetWithSearchParams() {
7374
datasetRepository={datasetRepository}
7475
fileRepository={fileRepository}
7576
metadataBlockInfoRepository={metadataBlockInfoRepository}
77+
contactRepository={contactRepository}
7678
filesTabInfiniteScrollEnabled={FILES_TAB_INFINITE_SCROLL_ENABLED}
7779
tab={tab}
7880
/>
@@ -90,6 +92,7 @@ function DatasetWithSearchParams() {
9092
datasetRepository={datasetRepository}
9193
fileRepository={fileRepository}
9294
metadataBlockInfoRepository={metadataBlockInfoRepository}
95+
contactRepository={contactRepository}
9396
created={created}
9497
publishInProgress={publishInProgress}
9598
metadataUpdated={metadataUpdated}

0 commit comments

Comments
 (0)